@HUST张友东 work@taobao zyd_com@126.com
分类: 服务器与存储
2012-11-03 14:47:03
core文件对问题查找非常有帮助,大部分时候我们能根据core文件直接定位到问题,但当出现内存乱掉的情况时,core的backtrace可能也不能指出问题源头。最近线上问题较多,针对dataserver出现的问题做个总结:
1. 如果在read/write时coredump,则多是因为磁盘故障(或是文件系统崩溃),IO的一些严重问题可通过dmesg查看,如果出现Medium Error,EXT4-fs error(device sdx), Device offlined, I/O error, rejecting I/O to dead device之类的关键字,就说明磁盘已经出问题了,如果是文件系统出问题,remount一下disk应该能正常工作;
2. 如果在读写index时coredump(每个block的索引通过mmap直接映射到内存),则多是由于访问到还没有map或是已经remap的内存,出现过的场景包括:
3. 代码中的assert失败,也会导致coredump,但这个是可预知的,在代码中加assert,说明执行到这个地方某些数据很关键,必须确保其为某个值,否则继续执行下去可能导致不可预知的后果;比如我们认为当dataserver运行时分配不到内存,则认为系统已经出问题了,让进程直接coredump。
4. dataserver cpu利用率持续偏高,这时需要先确定是哪些线程在占用cpu,通过top -p pid查看这个dataserver的负载情况,输入H命令显示线程的信息,可以看出哪些线程是罪魁祸首,根据线程tid与pstack的输出对照下,就能看出线程正在干什么,问题也就定位出来了,出现过的场景包括: