effective linux.3.(diagnosis)

20
Linux(3): Linux(3): programming programming diagnosis diagnosis hongjiang 2012.2.29 hongjiang 2012.2.29

Upload: wang-hongjiang

Post on 11-Jun-2015

559 views

Category:

Technology


2 download

DESCRIPTION

service diagnosis

TRANSCRIPT

Page 1: Effective linux.3.(diagnosis)

Effective Linux(3):Effective Linux(3): programming programming

diagnosisdiagnosis

hongjiang 2012.2.29hongjiang 2012.2.29

Page 2: Effective linux.3.(diagnosis)

diagnosisdiagnosis

► 案例案例11 :: apache + wordpress apache + wordpress 响应很慢响应很慢22 :: apacheapache 启动失败启动失败33 :某个:某个 javajava 线程线程 CPU 100%CPU 100%4: 4: 频繁频繁 GCGC 导致系统响应慢导致系统响应慢5: java5: java 线程数超常线程数超常6:6: 内存溢出内存溢出7: jvm crash 7: jvm crash 8: 8: 避免误杀别人的进程避免误杀别人的进程9: 9: 死锁死锁

Page 3: Effective linux.3.(diagnosis)

Case1: Case1: apache + wordpress apache + wordpress 响应很慢响应很慢

► 案例现象:案例现象: wordpresswordpress 中发布了大量图中发布了大量图片片 (( 图片未做压缩图片未做压缩 )) ,, blogblog 及其缓慢,无及其缓慢,无响应响应

► 解决过程:解决过程:1)1) 通过通过 toptop 发现发现 IOWaitIOWait 过高过高2)2) 定位那个进程导致定位那个进程导致3)3) 线上缺乏线上缺乏 iotopiotop 之类的工具之类的工具

Page 4: Effective linux.3.(diagnosis)

Case1: Case1: apache + wordpress apache + wordpress 响应很慢响应很慢

先停掉先停掉 syslogsyslog$ /etc/init.d/syslog stop$ /etc/init.d/syslog stop$ echo 1 > /proc/sys/vm/block_dump$ echo 1 > /proc/sys/vm/block_dump$ dmesg | grep -Ei "read|write|dirtied" | cut -d'(' -f1 | sort $ dmesg | grep -Ei "read|write|dirtied" | cut -d'(' -f1 | sort | uniq -c | sort -n | uniq -c | sort -n

确定是确定是 apacheapache 进程导致的进程导致的

不要忘记在抓完之后关掉不要忘记在抓完之后关掉 block_dumpblock_dump 和启动和启动 syslogsyslog$ echo 0 > /proc/sys/vm/block_dump$ echo 0 > /proc/sys/vm/block_dump$ /etc/init.d/syslog start$ /etc/init.d/syslog start

Page 5: Effective linux.3.(diagnosis)

Case1: Case1: apache + wordpress apache + wordpress 响应很慢响应很慢

►另一种诊断方式:另一种诊断方式:

$ ps -eo pid,user,wchan=WIDE-WCHAN-COLUMN -o s,cm$ ps -eo pid,user,wchan=WIDE-WCHAN-COLUMN -o s,cmd | awk '$4~/D/{print $0}‘d | awk '$4~/D/{print $0}‘

注: 注: D uninterruptible sleep (usually IO)D uninterruptible sleep (usually IO)

Page 6: Effective linux.3.(diagnosis)

Case1: Case1: apache + wordpress apache + wordpress 响应很慢响应很慢

解决方式,压缩图片:解决方式,压缩图片: imagemagickimagemagick

$ mogrify -quality 75 -resize 1280x1280 *.jpg$ mogrify -quality 75 -resize 1280x1280 *.jpg

$ mogrify -strip *.jpg$ mogrify -strip *.jpg

压缩图片后效果改善比较明显,后来将压缩图片后效果改善比较明显,后来将 apacheapache 替换替换为了为了 nginx nginx 性能更好一些。性能更好一些。

Page 7: Effective linux.3.(diagnosis)

Case2:Case2:apacheapache 启动失败启动失败

►案例现象:案例现象:OpenProxyOpenProxy 测试服务器 测试服务器 apacheapache 启动报: 启动报: No space left on device: Cannot create SSNo space left on device: Cannot create SSLMutexLMutex

11 、、 $ ipcs -s$ ipcs -s 看有没有超过看有没有超过 55 个,如果有执行:个,如果有执行:22 、、 $ ipcs -s | perl -ane '/^0x00000000/ && `ipcr$ ipcs -s | perl -ane '/^0x00000000/ && `ipcrm -s $F[1]`'m -s $F[1]`'33 、重启、重启 ApacheApache 服务。服务。

Page 8: Effective linux.3.(diagnosis)

Case3:Case3:某个某个 javajava 线程线程 CPU 100%CPU 100%

► 案例现象:案例现象:通过通过 toptop 发现发现 cpucpu 某个核的利用率一直是某个核的利用率一直是 100%100%

1)1) top top 里打开“线程”里打开“线程” optionoption ,定位到,定位到 100%100% 的线的线程程

2)2) jstack jstack 获取获取 javajava 进程堆栈进程堆栈3)3) printf %0x tid printf %0x tid 看线程看线程 idid 的的 1616 进制,然后在进制,然后在 stasta

cktracecktrace 里查看具体是哪个里查看具体是哪个 javajava 线程线程

注: 注: jdk6 nio jdk6 nio 导致导致 cpu 100% cpu 100% 的情况,在的情况,在 exodusexodus集群发生过若干次集群发生过若干次

Page 9: Effective linux.3.(diagnosis)

Case3:Case3:某个某个 javajava 线程线程 CPU 100%CPU 100%

► 回顾第二篇里对回顾第二篇里对 toptop 的介绍,除了在的介绍,除了在 toptop 交互模式中启动线程选项:交互模式中启动线程选项:

定位哪些定位哪些 javajava 线程 的使用率超过 线程 的使用率超过 50% 50% $ top -H -b -p 3260 | awk '/java/ && $9>50‘$ top -H -b -p 3260 | awk '/java/ && $9>50‘

有个线程有个线程 cpu 100%cpu 100% ,找出来,找出来$ top -H -b -p 3260 | grep 100$ top -H -b -p 3260 | grep 1003352 hongjian 20 0 1242m 37m 11m R 3352 hongjian 20 0 1242m 37m 11m R 100100 1.0 9:18.03 java 1.0 9:18.03 java 3352 hongjian 20 0 1242m 37m 11m R 3352 hongjian 20 0 1242m 37m 11m R 100100 1.0 9:21.02 java 1.0 9:21.02 java 3352 hongjian 20 0 1242m 37m 11m R 3352 hongjian 20 0 1242m 37m 11m R 100100 1.0 9:24.02 java 1.0 9:24.02 java

Page 10: Effective linux.3.(diagnosis)

Case4:Case4:频繁频繁 GCGC 导致系统响应慢导致系统响应慢

► GCGC 的问题比较复杂,各种情况,多关注网站的故的问题比较复杂,各种情况,多关注网站的故障报告,以及淘宝团队的障报告,以及淘宝团队的 blogblog

eg1: PermGeneg1: PermGen设置过小,因框架中设置过小,因框架中 CglibCglib创建了大创建了大量动态类量动态类

另有关另有关 PermGenPermGen触发触发 Full gcFull gc 的情况,参考撒加同学的情况,参考撒加同学的的 blogblog

eg2: eg2: 对象从新生代到老生代时晋升失败 对象从新生代到老生代时晋升失败 promotion failedpromotion failed

Page 11: Effective linux.3.(diagnosis)

Case4:Case4:频繁频繁 GCGC 导致系统响应慢导致系统响应慢

一些参数:一些参数:-Xloggc:/home/resin/logs/gc.log-Xloggc:/home/resin/logs/gc.log-XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCTimeStamps -XX:+PrintGCTimeStamps -XX:+PrintGCDetails-XX:+PrintGCDetails

工具:工具: jstatjstat

Page 12: Effective linux.3.(diagnosis)

Case5:Case5:线上线上 javajava 线程数超过线程数超过 15001500 个个

► 案例现象:案例现象:对中文站某次例行检查时发现对中文站某次例行检查时发现 exoudsexouds 集群集群 javajava 线线程数达到 程数达到 15001500以上,远远超过平时的范围(以上,远远超过平时的范围( 150~150~400400)。经诊断是)。经诊断是 iceice调用没有释放所致。调用没有释放所致。

$ ~/cmd/getserverlist "hz.exodus2~hz.exodus2" -o | xargs -$ ~/cmd/getserverlist "hz.exodus2~hz.exodus2" -o | xargs -n1 > /tmp/listn1 > /tmp/list

$ for s in `cat /tmp/list`; do ssh $s "ps -eL | grep java | wc -$ for s in `cat /tmp/list`; do ssh $s "ps -eL | grep java | wc -l" ; donel" ; done

Page 13: Effective linux.3.(diagnosis)

Case6:Case6:内存溢出内存溢出

► Case 1:Case 1:网站有好几次这样的故障,一个常见的情网站有好几次这样的故障,一个常见的情况是用况是用 MapMap 做做 CacheCache 的时候,以为的时候,以为 keykey 是少量有是少量有限的,但实际放入的限的,但实际放入的 keykey却是不同的却是不同的

► Case 2: BBL,Case 2: BBL,调用调用 PinyinUtilPinyinUtil 获取一个用户名称的获取一个用户名称的拼音时递归的太深,创建了大量的字符串拼音时递归的太深,创建了大量的字符串

► Case 3: BBL, DragoonCase 3: BBL, Dragoon 的的 Profiler Profiler 循环调用导致循环调用导致OOMOOM

Page 14: Effective linux.3.(diagnosis)

Case6:Case6:内存溢出内存溢出

► JAVA_OPTSJAVA_OPTS可以增加参数,可以增加参数,-XX:+HeapDumpOnOutOfMemoryError-XX:+HeapDumpOnOutOfMemoryError;以在内存溢出时,;以在内存溢出时,有证据可寻有证据可寻

诊断工具:诊断工具: jmap + matjmap + mat

Page 15: Effective linux.3.(diagnosis)

Case7:Case7:jvm crash jvm crash

►这类问题索要做的是分析这类问题索要做的是分析 crash logcrash log ,, googlgooglee 这种问题的解决方案,大多情况下升级虚这种问题的解决方案,大多情况下升级虚拟机可能解决这类问题。拟机可能解决这类问题。

crachcrach 文件中的信息文件中的信息 ::http://b2b-doc.alibaba-inc.com/pages/viewpage.action?pageId=45217247http://b2b-doc.alibaba-inc.com/pages/viewpage.action?pageId=45217247

http://b2b-doc.alibaba-inc.com/pages/viewpage.action?pageId=17160924http://b2b-doc.alibaba-inc.com/pages/viewpage.action?pageId=17160924

Page 16: Effective linux.3.(diagnosis)

Case7:Case7:jvm crashjvm crash

11)中文站)中文站 jvmjvm 频繁频繁 crashcrash20092009年底,年底, 20102010年初,这种情况比较频繁,年初,这种情况比较频繁,经分析是在经分析是在 gcgc 时时 crashcrash 的,的,

解决方案: 升级更新版本的解决方案: 升级更新版本的 jdkjdk 。(对于升。(对于升级级 jdk,jdk, 校长非常谨慎)校长非常谨慎)

Page 17: Effective linux.3.(diagnosis)

Case7:Case7:jvm crashjvm crash

Case 2: Case 2: 中文站中文站 spuspu业务服务器上发生的:业务服务器上发生的: java.lang.OutOfMemoryError: requested 4294967312 bytes for Chunk::new. java.lang.OutOfMemoryError: requested 4294967312 bytes for Chunk::new. Out of swap space?Out of swap space?很奇怪,居然要分配很奇怪,居然要分配 4G4G空间?!空间?!Current CompileTask: C2:2343 ! org.apache.velocity.runtime.directive.ForeCurrent CompileTask: C2:2343 ! org.apache.velocity.runtime.directive.Foreach.render(Lorg/apache/velocity/context/InternalContextAdapter;Ljava/ioach.render(Lorg/apache/velocity/context/InternalContextAdapter;Ljava/io/Writer;Lorg/apache/velocity/runtime/parser/node/Node;)Z (529 bytes)/Writer;Lorg/apache/velocity/runtime/parser/node/Node;)Z (529 bytes)

已经有很多人报过这个已经有很多人报过这个 bugbug 了,解决方法这里: 了,解决方法这里:

http://confluence.atlassian.com/pages/viewpage.action?pageId=21902368http://confluence.atlassian.com/pages/viewpage.action?pageId=2190236866

简单方法是升级简单方法是升级 jdkjdk 到到 1.6 update231.6 update23以上,或者使用参数:以上,或者使用参数:-XX:CompileCommand=exclude,org/apache/velocity/runtime/directive/Foreach,render-XX:CompileCommand=exclude,org/apache/velocity/runtime/directive/Foreach,render

Page 18: Effective linux.3.(diagnosis)

Case8:Case8:避免误杀别人的进程避免误杀别人的进程

► 案例现象:案例现象:周二周二 BBL BBL 短域名服务器被短域名服务器被 kdlibkdlib 开发误杀。开发误杀。

如何查看一个进程是谁启动的呢?如果大家都用的如何查看一个进程是谁启动的呢?如果大家都用的admin admin 帐号。帐号。

从环境变量中查找信息。从环境变量中查找信息。

Page 19: Effective linux.3.(diagnosis)

Case8:Case8:避免误杀别人的进程避免误杀别人的进程

► [admin@bode-redis09 2819]$ [admin@bode-redis09 2819]$ ps auxe | grep "[r]edis-server“ps auxe | grep "[r]edis-server“

admin 2819 0.0 1.7 1739508 1693952 ? Ssl Feb03 0:23 bin/redis-server conf/130admin 2819 0.0 1.7 1739508 1693952 ? Ssl Feb03 0:23 bin/redis-server conf/13000.conf HOSTNAME=bode-redis09.hst.xyi.cn.alidc.net SHELL=/bin/bash TERM=xter00.conf HOSTNAME=bode-redis09.hst.xyi.cn.alidc.net SHELL=/bin/bash TERM=xterm-256color HISTSIZE=1000 SSH_CLIENT=172.22.33.3 45875 22 OLDPWD=/home/admm-256color HISTSIZE=1000 SSH_CLIENT=172.22.33.3 45875 22 OLDPWD=/home/admin/bazas/deploy/bazas.agent.deploy SSH_TTY=/dev/pts/1 ANT_HOME=/usr/alibaba/in/bazas/deploy/bazas.agent.deploy SSH_TTY=/dev/pts/1 ANT_HOME=/usr/alibaba/ant USER=admin LS_COLORS= LD_LIBRARY_PATH=/usr/alibaba/install/jdk1.6.0_25/jant USER=admin LS_COLORS= LD_LIBRARY_PATH=/usr/alibaba/install/jdk1.6.0_25/jre/lib/amd64/server:/usr/alibaba/install/jdk1.6.0_25/jre/lib/amd64:/usr/alibaba/instre/lib/amd64/server:/usr/alibaba/install/jdk1.6.0_25/jre/lib/amd64:/usr/alibaba/install/jdk1.6.0_25/jre/../lib/amd64:/home/admin/search/root/lib:/home/admin/usr/locall/jdk1.6.0_25/jre/../lib/amd64:/home/admin/search/root/lib:/home/admin/usr/local/lib/lib TMOUT=6000 NLSPATH=/usr/dt/lib/nls/msg/%L/%N.cat PATH=/usr/alibabaal/lib/lib TMOUT=6000 NLSPATH=/usr/dt/lib/nls/msg/%L/%N.cat PATH=/usr/alibaba/java/bin:/usr/alibaba/ant/bin:/usr/alibaba/antx-2/bin:/usr/kerberos/bin:/usr/local//java/bin:/usr/alibaba/ant/bin:/usr/alibaba/antx-2/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/admin/bin MAIL=/var/spool/mail/admin PWbin:/bin:/usr/bin:/usr/X11R6/bin:/home/admin/bin MAIL=/var/spool/mail/admin PWD=/home/admin/bazas/deploy/bazas.agent.deploy/redis INPUTRC=/etc/inputrc ANTD=/home/admin/bazas/deploy/bazas.agent.deploy/redis INPUTRC=/etc/inputrc ANTX_HOME=/usr/alibaba/antx-2 JAVA_HOME=/home/admin/jdk1.6.0_27 X_HOME=/usr/alibaba/antx-2 JAVA_HOME=/home/admin/jdk1.6.0_27 SHTERM_REASHTERM_REAL_USER=zhijun.qiuzj L_USER=zhijun.qiuzj LANG=en_US ……LANG=en_US ……

Page 20: Effective linux.3.(diagnosis)

Case9:Case9:死锁死锁

► 中文站中文站 0909年下半年,频繁出现年下半年,频繁出现对象创建过程导致死锁 对象创建过程导致死锁 (com.alibaba.com(com.alibaba.common.lang.enumeration.Enum)mon.lang.enumeration.Enum)细节见:细节见:

http://b2b-doc.alibaba-inc.com/pages/viewpage.action?phttp://b2b-doc.alibaba-inc.com/pages/viewpage.action?pageId=34412175ageId=34412175

推荐:《推荐:《 Java PuzzleJava Puzzle 》》