Effective Linux(3):  programming diagnosis hongjiang 2012.2.29
diagnosis 案例 1 : apache + wordpress  响应很慢 2 : apache 启动失败 3 :某个 java 线程 CPU 100% 4:  频繁 GC 导致系统响应慢 5:  java 线程数超常 6: 内存溢出 7:  jvm crash  8:  避免误杀别人的进程 9:  死锁
Case1:  apache + wordpress  响应很慢 案例现象: wordpress 中发布了大量图片 ( 图片未做压缩 ) , blog 及其缓慢,无响应 解决过程: 通过 top 发现 IOWait 过高 定位那个进程导致 线上缺乏 iotop 之类的工具
Case1:  apache + wordpress  响应很慢 先停掉 syslog $ /etc/init.d/syslog stop $ echo 1 > /proc/sys/vm/block_dump $ dmesg | grep -Ei "read|write|dirtied" | cut -d'(' -f1 | sort | uniq -c | sort -n  确定是 apache 进程导致的 不要忘记在抓完之后关掉 block_dump 和启动 syslog $ echo 0 > /proc/sys/vm/block_dump $ /etc/init.d/syslog start
Case1:  apache + wordpress  响应很慢 另一种诊断方式: $ ps -eo pid,user,wchan=WIDE-WCHAN-COLUMN -o s,cmd | awk  '$4~/D/{print $0}‘ 注:  D  uninterruptible sleep (usually IO)
Case1:  apache + wordpress  响应很慢 解决方式,压缩图片: imagemagick $ mogrify -quality 75 -resize 1280x1280 *.jpg $ mogrify -strip *.jpg 压缩图片后效果改善比较明显,后来将 apache 替换为了 nginx  性能更好一些。
Case2: apache 启动失败 案例现象: OpenProxy 测试服务器  apache 启动报:  No space left on device: Cannot create SSLMutex 1 、 $ ipcs -s   看有没有超过 5 个,如果有执行: 2 、 $ ipcs -s | perl -ane '/^0x00000000/ && `ipcrm -s $F[1]`' 3 、重启 Apache 服务。
Case3: 某个 java 线程 CPU 100% 案例现象: 通过 top 发现 cpu 某个核的利用率一直是 100% top  里打开“线程” option ,定位到 100% 的线程 jstack  获取 java 进程堆栈 printf %0x tid  看线程 id 的 16 进制,然后在 stacktrace 里查看具体是哪个 java 线程 注:  jdk6 nio  导致 cpu 100%  的情况,在 exodus 集群发生过若干次
Case3: 某个 java 线程 CPU 100% 回顾第二篇里对 top 的介绍,除了在 top 交互模式中启动线程选项: 定位哪些 java 线程 的使用率超过  50%  $ top -H -b -p 3260 | awk '/java/ && $9>50‘ 有个线程 cpu 100% ,找出来 $ top -H -b -p 3260 | grep 100 3352 hongjian  20  0 1242m  37m  11m R  100   1.0  9:18.03 java  3352 hongjian  20  0 1242m  37m  11m R  100   1.0  9:21.02 java  3352 hongjian  20  0 1242m  37m  11m R  100   1.0  9:24.02 java
Case4: 频繁 GC 导致系统响应慢 GC 的问题比较复杂,各种情况,多关注网站的故障报告,以及淘宝团队的 blog eg1: PermGen 设置过小,因框架中 Cglib 创建了大量动态类 另有关 PermGen 触发 Full gc 的情况,参考撒加同学的 blog eg2:  对象从新生代到老生代时晋升失败  promotion failed
Case4: 频繁 GC 导致系统响应慢 一些参数: -Xloggc:/home/resin/logs/gc.log -XX:+PrintGCApplicationStoppedTime  -XX:+PrintGCTimeStamps  -XX:+PrintGCDetails 工具: jstat
Case5: 线上 java 线程数超过 1500 个 案例现象: 对中文站某次例行检查时发现 exouds 集群 java 线程数达到  1500 以上,远远超过平时的范围( 150~400 )。经诊断是 ice 调用没有释放所致。 $ ~/cmd/getserverlist "hz.exodus2~hz.exodus2" -o | xargs -n1 > /tmp/list $ for s in `cat /tmp/list`; do ssh $s "ps -eL | grep java | wc -l" ; done
Case6: 内存溢出 Case 1: 网站有好几次这样的故障,一个常见的情况是用 Map 做 Cache 的时候,以为 key 是少量有限的,但实际放入的 key 却是不同的 Case 2: BBL, 调用 PinyinUtil 获取一个用户名称的拼音时递归的太深,创建了大量的字符串 Case 3:  BBL, Dragoon 的 Profiler  循环调用导致 OOM
Case6: 内存溢出 JAVA_OPTS 可以增加参数, -XX:+HeapDumpOnOutOfMemoryError ;以在内存溢出时,有证据可寻 诊断工具: jmap + mat
Case7: jvm crash  这类问题索要做的是分析 crash log , google 这种问题的解决方案,大多情况下升级虚拟机可能解决这类问题。 crach 文件中的信息 : http://b2b-doc.alibaba-inc.com/pages/viewpage.action?pageId=45217247 http://b2b-doc.alibaba-inc.com/pages/viewpage.action?pageId=17160924
Case7: jvm crash 1 )中文站 jvm 频繁 crash 2009 年底, 2010 年初,这种情况比较频繁,经分析是在 gc 时 crash 的, 解决方案: 升级更新版本的 jdk 。(对于升级 jdk, 校长非常谨慎)
Case7: jvm crash Case 2:  中文站 spu 业务服务器上发生的:   java.lang.OutOfMemoryError: requested 4294967312 bytes for Chunk::new. Out of swap space? 很奇怪,居然要分配 4G 空间?! Current CompileTask: C2:2343 ! org.apache.velocity.runtime.directive.Foreach.render(Lorg/apache/velocity/context/InternalContextAdapter;Ljava/io/Writer;Lorg/apache/velocity/runtime/parser/node/Node;)Z (529 bytes) 已经有很多人报过这个 bug 了,解决方法这里:  http://confluence.atlassian.com/pages/viewpage.action?pageId=219023686 简单方法是升级 jdk 到 1.6 update23 以上,或者使用参数: -XX:CompileCommand=exclude,org/apache/velocity/runtime/directive/Foreach,render
Case8: 避免误杀别人的进程 案例现象: 周二 BBL  短域名服务器被 kdlib 开发误杀。 如何查看一个进程是谁启动的呢?如果大家都用的 admin  帐号。 从环境变量中查找信息。
Case8: 避免误杀别人的进程 [admin@bode-redis09 2819]$  ps auxe | grep "[r]edis-server“ admin  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=xterm-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/ant 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/install/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/alibaba/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 PWD=/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  SHTERM_REAL_USER=zhijun.qiuzj  LANG=en_US ……
Case9: 死锁 中文站 09 年下半年,频繁出现 对象创建过程导致死锁  (com.alibaba.common.lang.enumeration.Enum) 细节见: http://b2b-doc.alibaba-inc.com/pages/viewpage.action?pageId=34412175 推荐:《 Java Puzzle 》

Effective linux.3.(diagnosis)

  • 1.
    Effective Linux(3): programming diagnosis hongjiang 2012.2.29
  • 2.
    diagnosis 案例 1: apache + wordpress 响应很慢 2 : apache 启动失败 3 :某个 java 线程 CPU 100% 4: 频繁 GC 导致系统响应慢 5: java 线程数超常 6: 内存溢出 7: jvm crash 8: 避免误杀别人的进程 9: 死锁
  • 3.
    Case1: apache+ wordpress 响应很慢 案例现象: wordpress 中发布了大量图片 ( 图片未做压缩 ) , blog 及其缓慢,无响应 解决过程: 通过 top 发现 IOWait 过高 定位那个进程导致 线上缺乏 iotop 之类的工具
  • 4.
    Case1: apache+ wordpress 响应很慢 先停掉 syslog $ /etc/init.d/syslog stop $ echo 1 > /proc/sys/vm/block_dump $ dmesg | grep -Ei "read|write|dirtied" | cut -d'(' -f1 | sort | uniq -c | sort -n 确定是 apache 进程导致的 不要忘记在抓完之后关掉 block_dump 和启动 syslog $ echo 0 > /proc/sys/vm/block_dump $ /etc/init.d/syslog start
  • 5.
    Case1: apache+ wordpress 响应很慢 另一种诊断方式: $ ps -eo pid,user,wchan=WIDE-WCHAN-COLUMN -o s,cmd | awk '$4~/D/{print $0}‘ 注: D uninterruptible sleep (usually IO)
  • 6.
    Case1: apache+ wordpress 响应很慢 解决方式,压缩图片: imagemagick $ mogrify -quality 75 -resize 1280x1280 *.jpg $ mogrify -strip *.jpg 压缩图片后效果改善比较明显,后来将 apache 替换为了 nginx 性能更好一些。
  • 7.
    Case2: apache 启动失败案例现象: OpenProxy 测试服务器 apache 启动报: No space left on device: Cannot create SSLMutex 1 、 $ ipcs -s 看有没有超过 5 个,如果有执行: 2 、 $ ipcs -s | perl -ane '/^0x00000000/ && `ipcrm -s $F[1]`' 3 、重启 Apache 服务。
  • 8.
    Case3: 某个 java线程 CPU 100% 案例现象: 通过 top 发现 cpu 某个核的利用率一直是 100% top 里打开“线程” option ,定位到 100% 的线程 jstack 获取 java 进程堆栈 printf %0x tid 看线程 id 的 16 进制,然后在 stacktrace 里查看具体是哪个 java 线程 注: jdk6 nio 导致 cpu 100% 的情况,在 exodus 集群发生过若干次
  • 9.
    Case3: 某个 java线程 CPU 100% 回顾第二篇里对 top 的介绍,除了在 top 交互模式中启动线程选项: 定位哪些 java 线程 的使用率超过 50% $ top -H -b -p 3260 | awk '/java/ && $9>50‘ 有个线程 cpu 100% ,找出来 $ top -H -b -p 3260 | grep 100 3352 hongjian 20 0 1242m 37m 11m R 100 1.0 9:18.03 java 3352 hongjian 20 0 1242m 37m 11m R 100 1.0 9:21.02 java 3352 hongjian 20 0 1242m 37m 11m R 100 1.0 9:24.02 java
  • 10.
    Case4: 频繁 GC导致系统响应慢 GC 的问题比较复杂,各种情况,多关注网站的故障报告,以及淘宝团队的 blog eg1: PermGen 设置过小,因框架中 Cglib 创建了大量动态类 另有关 PermGen 触发 Full gc 的情况,参考撒加同学的 blog eg2: 对象从新生代到老生代时晋升失败 promotion failed
  • 11.
    Case4: 频繁 GC导致系统响应慢 一些参数: -Xloggc:/home/resin/logs/gc.log -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCTimeStamps -XX:+PrintGCDetails 工具: jstat
  • 12.
    Case5: 线上 java线程数超过 1500 个 案例现象: 对中文站某次例行检查时发现 exouds 集群 java 线程数达到 1500 以上,远远超过平时的范围( 150~400 )。经诊断是 ice 调用没有释放所致。 $ ~/cmd/getserverlist "hz.exodus2~hz.exodus2" -o | xargs -n1 > /tmp/list $ for s in `cat /tmp/list`; do ssh $s "ps -eL | grep java | wc -l" ; done
  • 13.
    Case6: 内存溢出 Case1: 网站有好几次这样的故障,一个常见的情况是用 Map 做 Cache 的时候,以为 key 是少量有限的,但实际放入的 key 却是不同的 Case 2: BBL, 调用 PinyinUtil 获取一个用户名称的拼音时递归的太深,创建了大量的字符串 Case 3: BBL, Dragoon 的 Profiler 循环调用导致 OOM
  • 14.
    Case6: 内存溢出 JAVA_OPTS可以增加参数, -XX:+HeapDumpOnOutOfMemoryError ;以在内存溢出时,有证据可寻 诊断工具: jmap + mat
  • 15.
    Case7: jvm crash 这类问题索要做的是分析 crash log , google 这种问题的解决方案,大多情况下升级虚拟机可能解决这类问题。 crach 文件中的信息 : http://b2b-doc.alibaba-inc.com/pages/viewpage.action?pageId=45217247 http://b2b-doc.alibaba-inc.com/pages/viewpage.action?pageId=17160924
  • 16.
    Case7: jvm crash1 )中文站 jvm 频繁 crash 2009 年底, 2010 年初,这种情况比较频繁,经分析是在 gc 时 crash 的, 解决方案: 升级更新版本的 jdk 。(对于升级 jdk, 校长非常谨慎)
  • 17.
    Case7: jvm crashCase 2: 中文站 spu 业务服务器上发生的: java.lang.OutOfMemoryError: requested 4294967312 bytes for Chunk::new. Out of swap space? 很奇怪,居然要分配 4G 空间?! Current CompileTask: C2:2343 ! org.apache.velocity.runtime.directive.Foreach.render(Lorg/apache/velocity/context/InternalContextAdapter;Ljava/io/Writer;Lorg/apache/velocity/runtime/parser/node/Node;)Z (529 bytes) 已经有很多人报过这个 bug 了,解决方法这里: http://confluence.atlassian.com/pages/viewpage.action?pageId=219023686 简单方法是升级 jdk 到 1.6 update23 以上,或者使用参数: -XX:CompileCommand=exclude,org/apache/velocity/runtime/directive/Foreach,render
  • 18.
    Case8: 避免误杀别人的进程 案例现象:周二 BBL 短域名服务器被 kdlib 开发误杀。 如何查看一个进程是谁启动的呢?如果大家都用的 admin 帐号。 从环境变量中查找信息。
  • 19.
    Case8: 避免误杀别人的进程 [admin@bode-redis092819]$ ps auxe | grep "[r]edis-server“ admin 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=xterm-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/ant 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/install/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/alibaba/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 PWD=/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 SHTERM_REAL_USER=zhijun.qiuzj LANG=en_US ……
  • 20.
    Case9: 死锁 中文站09 年下半年,频繁出现 对象创建过程导致死锁 (com.alibaba.common.lang.enumeration.Enum) 细节见: http://b2b-doc.alibaba-inc.com/pages/viewpage.action?pageId=34412175 推荐:《 Java Puzzle 》