Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Effective linux.3.(diagnosis)

939 views

Published on

service diagnosis

Published in: Technology, News & Politics
  • Be the first to comment

Effective linux.3.(diagnosis)

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

×