Effective Linux(3):  programming diagnosis hongjiang 2012.2.29
diagnosis <ul><li>案例 </li></ul><ul><li>1 : apache + wordpress  响应很慢 </li></ul><ul><li>2 : apache 启动失败 </li></ul><ul><li>3 ...
Case1:  apache + wordpress  响应很慢 <ul><li>案例现象: wordpress 中发布了大量图片 ( 图片未做压缩 ) , blog 及其缓慢,无响应 </li></ul><ul><li>解决过程: </li>...
Case1:  apache + wordpress  响应很慢 <ul><li>先停掉 syslog </li></ul><ul><li>$ /etc/init.d/syslog stop </li></ul><ul><li>$ echo 1...
Case1:  apache + wordpress  响应很慢 <ul><li>另一种诊断方式: </li></ul><ul><li>$ ps -eo pid,user,wchan=WIDE-WCHAN-COLUMN -o s,cmd | a...
Case1:  apache + wordpress  响应很慢 <ul><li>解决方式,压缩图片: imagemagick </li></ul><ul><li>$ mogrify -quality 75 -resize 1280x1280 ...
Case2: apache 启动失败 <ul><li>案例现象: </li></ul><ul><li>OpenProxy 测试服务器  apache 启动报:  </li></ul><ul><li>No space left on device...
Case3: 某个 java 线程 CPU 100% <ul><li>案例现象: </li></ul><ul><li>通过 top 发现 cpu 某个核的利用率一直是 100% </li></ul><ul><li>top  里打开“线程” op...
Case3: 某个 java 线程 CPU 100% <ul><li>回顾第二篇里对 top 的介绍,除了在 top 交互模式中启动线程选项: </li></ul><ul><li>定位哪些 java 线程 的使用率超过  50%  </li><...
Case4: 频繁 GC 导致系统响应慢 <ul><li>GC 的问题比较复杂,各种情况,多关注网站的故障报告,以及淘宝团队的 blog </li></ul><ul><li>eg1: PermGen 设置过小,因框架中 Cglib 创建了大量动...
Case4: 频繁 GC 导致系统响应慢 <ul><li>一些参数: </li></ul><ul><li>-Xloggc:/home/resin/logs/gc.log </li></ul><ul><li>-XX:+PrintGCApplica...
Case5: 线上 java 线程数超过 1500 个 <ul><li>案例现象: </li></ul><ul><li>对中文站某次例行检查时发现 exouds 集群 java 线程数达到  1500 以上,远远超过平时的范围( 150~400...
Case6: 内存溢出 <ul><li>Case 1: 网站有好几次这样的故障,一个常见的情况是用 Map 做 Cache 的时候,以为 key 是少量有限的,但实际放入的 key 却是不同的 </li></ul><ul><li>Case 2:...
Case6: 内存溢出 <ul><li>JAVA_OPTS 可以增加参数, </li></ul><ul><li>-XX:+HeapDumpOnOutOfMemoryError ;以在内存溢出时,有证据可寻 </li></ul><ul><li>诊...
Case7: jvm crash  <ul><li>这类问题索要做的是分析 crash log , google 这种问题的解决方案,大多情况下升级虚拟机可能解决这类问题。 </li></ul><ul><li>crach 文件中的信息 : </...
Case7: jvm crash <ul><li>1 )中文站 jvm 频繁 crash </li></ul><ul><li>2009 年底, 2010 年初,这种情况比较频繁,经分析是在 gc 时 crash 的, </li></ul><ul...
Case7: jvm crash <ul><li>Case 2:  中文站 spu 业务服务器上发生的: </li></ul><ul><li>  java.lang.OutOfMemoryError: requested 4294967312 ...
Case8: 避免误杀别人的进程 <ul><li>案例现象: </li></ul><ul><ul><li>周二 BBL  短域名服务器被 kdlib 开发误杀。 </li></ul></ul><ul><ul><li>如何查看一个进程是谁启动的呢...
Case8: 避免误杀别人的进程 <ul><li>[admin@bode-redis09 2819]$  ps auxe | grep &quot;[r]edis-server“ </li></ul><ul><li>admin  2819  0...
Case9: 死锁 <ul><li>中文站 09 年下半年,频繁出现 </li></ul><ul><li>对象创建过程导致死锁  (com.alibaba.common.lang.enumeration.Enum) </li></ul><ul>...
Upcoming SlideShare
Loading in...5
×

Effective linux.3.(diagnosis)

579

Published on

service diagnosis

Published in: Technology, News & Politics
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
579
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
31
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

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>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×