MooseFS之虚拟机惹的祸

标签: 数据存储 | 发表时间:2013-10-23 17:49 | 作者:海洪
出处:http://tech.uc.cn

说在前面

我们平时在技术研究和支撑的过程中常常会遇到一些坑,我想把踩过的坑分享出来是一种美德,后续打算写一个系列,慢慢积累,希望能够帮到大家。

问题描述

这是最近遇到的一个MooseFS的坑,觉得有点意思,分享一下。

国庆假期前,我们的MooseFS集群刚好有一台ChunkServer机器挂了,国庆期间没人维护集群,因此只好在假期后维修机器,修好后重新启动,结果导致Master无响应几十分钟,整个集群瘫痪了,情况非常恶劣。运维同学查看Master的日志/var/log/messages,发现总共有几十万行: chunkserver has nonexistent chunk (00000000139811BC_00000001), so create it for future deletion 这样的日志。在Master无响应的几十分钟里,其实有尝试重启Master和ChunkServer,但都没用,最后等“nonexistent chunk”汇报完了之后才恢复正常。

问题分析

有日志其实好办,直接找到该日志对应的源码,查看了相关的处理逻辑,其处理流程大概是这样的:

  1. ChunkServer启动之后会向Master汇报Chunk信息。
  2. Master收到Chunk信息之后会逐个检查Chunk_id是否存在。
  3. 如果不存在,表示该chunk_id其实已经删除了(chunk_id过期),于是写syslog日志,然后调用chunk_new()创建该chunk,并设置lockedto属性为7天后。

看了几遍这个处理逻辑,基本都是内存操作,并且Master是单线程的进程,并不存在全局锁,应该不会导致Master阻塞无响应。由于我们使用的版本是1.6.19,于是想到需要对比一下最新的1.6.27源码,发现在1.6.27中已经把写syslog日志的这句代码注释掉了。整个过程只有这个地方是写磁盘的,所以它的嫌疑最大。

于是我们做了如下测试:

  • 生成1个1万行的文本文件test_syslog.txt。
  • 利用logger命令写入/var/log/messages测试syslog写入速度

首先在一台物理机上进行测试:

time logger -f test_syslog.txt 

real0m0.141s
user0m0.063s
sys 0m0.031s

从测试结果看,syslog写磁盘其实是很快的,TPS能够达到7万以上,按理不会导致Master长时间无响应,除非硬盘有问题。于是让运维同学按照在线上的Master做同样的测试,结果如下:

time logger -f test_syslog.txt 

real0m9.281s
user0m0.222s
sys 0m0.217s

线上TPS只能达到1千,与测试机的性能相差65倍左右。 原来,在不久前运维同学因为机器资源紧张把Master从物理机换成了虚拟机,而虚拟机的镜像存储是直接挂在iSCSI设备上的,结果写syslog变成了直接写网络iSCSI设备而不是本地磁盘,因此性能大大下降。

解决方法

  1. 修改Master的代码,直接注释掉该syslog打印语句,可缓解这个情况。
  2. Master迁移回物理机,可预防更多的问题发生。

慎用虚拟机

总结一下,MooseFS的Master是单线程的程序,并不能发挥多核CPU的优势,由于大部分的处理逻辑都是内存操作,因此并不会存在太大的问题,但一旦涉及到磁盘I/O就有可能导致阻塞,严重的话整个集群会瘫痪掉,因此不建议把Master放在虚拟机中。

单线程是个硬伤

其实MooseFS的代码写的还是不错的,但Master的单线程机制不能够发挥多核CPU的优势,导致其性能有很大的瓶颈,因此大家在做存储选型的时候要注意了。我们在相同集群上测试过MooseFS和HDFS小文件的读写性能,其中MooseFS的写TPS只能达到100,读TPS只能达到1000,而HDFS的写TPS能达到1000以上,读TPS能达到10000以上,两者相差10倍。

可想而知,MooseFS单线程是一个硬伤,并不适合高并发的业务。

相关 [moosefs 虚拟机] 推荐:

MooseFS之虚拟机惹的祸

- - UC技术博客
我们平时在技术研究和支撑的过程中常常会遇到一些坑,我想把踩过的坑分享出来是一种美德,后续打算写一个系列,慢慢积累,希望能够帮到大家. 这是最近遇到的一个MooseFS的坑,觉得有点意思,分享一下. 国庆假期前,我们的MooseFS集群刚好有一台ChunkServer机器挂了,国庆期间没人维护集群,因此只好在假期后维修机器,修好后重新启动,结果导致Master无响应几十分钟,整个集群瘫痪了,情况非常恶劣.

Java虚拟机家族考

- ReadReply - 博客园新闻频道
  说起Java虚拟机,许多Java程序员都会潜意识地把它与Sun[1] HotSpot虚拟机等同看待,也许还有一些程序员会注意到BEA JRockit和IBM J9,但大多数人对JVM的认识都仅限于此了.   从1996年初Sun发布的JDK 1.0中所包含的Sun Classic VM算起,Java虚拟机已经发展了15个年头,沧海桑田一瞬间,15年转眼而过,这期间曾经涌现、湮灭过许多或经典或优秀或有特色的虚拟机实现,在《Java虚拟机专栏》的第1篇中,我们先暂且把代码与技术放下,一起来回顾一下Java虚拟机家族的发展轨迹和历史变迁.

Python 虚拟机实现(一)

- xcv58 - python.cn(jobs, news)
python并不将py文件编译为机器码来运行,而是由python虚拟机一条条地将py語句解释运行,这也是为什么被称为解释语言的原因之一. 但python虚拟机并不直接执行py語句,它执行编译py語句后生成的字节码. 本篇简单地讲下编译、运行的过程,涉及到的内容有如何编译、控制流、函数及类的实现等. python将py文件编译成为PyCodeObject,再将这个对象写入某文件就成为了pyc文件,文件中包含python的magic number(来说明编译时使用的python版本号)、源文件的mtime(使pyc和py文件保持同步)、编译出的code对象.

Xen 虚拟机架构

- - 博客园_知识库
  Xen 是一个基于开源软件组织的虚拟机监控器(即 Virtual Machine Monitor 简称 VMM),可以允许在单一的物理机器上同时运行多个操作系统实例.   虚拟计算机的概念最早由 IBM 公司在上世纪六七十年代提出,并将其运用于 VM/370 系统中以共享昂贵的大型机系统(Main Frame).

虚拟机三种协议

- - 操作系统 - ITeye博客
如何使虚拟机与主机互相能ping通 刚刚因为虚拟机与主机没法互相ping通的事情,奋战到将近凌晨一点. 现在把这个过程总结一下,以方便后加入该行业的广大IT精英. VMWare提供了三种工作模式:bridged(桥接模式)、NAT(网络地址转换模式)和host-only(主机模式). 1.       bridged(桥接模式).

Colinux,不是虚拟机,胜似虚拟机

- wq - C++博客-首页原创精华区
排版走样了,点击下载Doc/pdf版本. 我似乎已经更喜欢使用word写东西,感觉更正式,缺点是发布为web版本时格式乱糟糟的. Colinux,不是虚拟机,胜似虚拟机 一些使用记录 潘孙友 2010.12.25 于遵义. 目录 一、Colinux长什么样. Colinux的格言是:如果Linux 可以运行在任何一种体系架构(i386,PowerPC,...).

SEO利器-Google GSA虚拟机版本

- Class4 - 车东[Blog^2]
在所有的SEO工具中,能够被称为利器的工具不多,但Google GSA虚拟机版本绝对算是一个. 去年我介绍了《利用Google Search Appliance 服务器做SEO 》,不过这个正式版实在太昂贵而且根据美国的某条法律不销售给中国,所以很多人都没办法用来做SEO应用. 而Google GSA虚拟机版本就很好的解决了这个问题.

文章: Java虚拟机家族考

- Haides - InfoQ中文站
说起Java虚拟机,许多Java程序员都会潜意识地把它与Sun HotSpot虚拟机等同看待,也许还有一些程序员会注意到BEA JRockit和IBM J9,但大多数人对JVM的认识都仅限于此了. 从1996年初Sun发布的JDK 1.0中所包含的Sun Classic VM算起,Java虚拟机已经发展了15个年头,沧海桑田一瞬间,15年转眼而过,这期间曾经涌现、湮灭过许多或经典或优秀或有特色的虚拟机实现,在《Java虚拟机专栏》的第1篇中,我们先暂且把代码与技术放下,一起来回顾一下Java虚拟机家族的发展轨迹和历史变迁.

历史篇:Java虚拟机家族考

- Guancheng(冠诚) - FenixSoft 3.0
  声明:本文为笔者原创,但首发于InfoQ中文站,详见文末声明.   说起Java虚拟机,许多Java程序员都会潜意识地把它与Sun[注1] HotSpot虚拟机等同看待,也许还有一些程序员会注意到BEA JRockit和IBM J9,但大多数人对JVM的认识都仅限于此了.   从1996年初Sun发布的JDK 1.0中所包含的Sun Classic VM算起,Java虚拟机已经发展了15个年头,沧海桑田一瞬间,15年转眼而过,这期间曾经涌现、湮灭过许多或经典或优秀或有特色的虚拟机实现,在《Java虚拟机专栏》的第1篇中,我们先暂且把代码与技术放下,一起来回顾一下Java虚拟机家族的发展轨迹和历史变迁.

KVM 虚拟机故障排除一例

- 火锅土豆 - LinuxTOY
笔者在部署 KVM 虚拟机时曾遇到一个奇怪的问题,几经探索之后终于解决,现在写出来跟大家分享一下. 笔者在单位部署了一台服务器,上面运行着几部 KVM 虚拟机,分别执行不同的任务. 系统上线之后,需要再增加几部虚拟机. 因为当初部署服务器时做了虚拟机备份,所以就复制了一个备份的虚拟机. 可是新虚拟机启动之后无法在本地网络上找到新虚拟机的 IP 地址(本地网络采用 DHCP 分配 IP 地址).