性能优化思路与具体问题分析过程
分布式主要解决两个问题:路由+备份;MySQL数据库集群:采用主从架构,master上面的binlog会同步到slave节点上面apply;redis集群的主备与之类似;
计算机技术归根结底都是在解决一个key value对应关系;分而治之思想无处不在,MR思想等,其实生活中分治思想无处不在。
GC和锁是Java两大死穴,GC可以采用对外内存方式解决;锁,可以采用数据多版本思想,例如Oracle数据库中的数据多版本。
问题分析过程:
多次执行jstack看看最后部分,锁着的代码
jstat -gcutil 28232 2000
这三列重点监控,一个是年老代的暂用百分百,还有Full GC的次数和耗时
在进程中加入参数,记录gc历史
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log
上图中->之前表示回收之前大小,之后表示回收之后大小。
一份已经存在的代码,运行时占用内存偏高,或者抛出OutOfMemoryError(OOME)
用jmap得到进程的运行时内存镜像 jmap -dump:live,format=b,file=jmap.dat ${PID},其中-dump:live表示堆中活动对象,这个限定要分析对象范围。
用jhat进行内存分析 jhat -J-Xmx4g jmap.dat,会启动后会建立一个http server,端口为7000,之后通过浏览器查看统计数据并分析问题,一般是第一个链接进去就能查询到比较多的对象。
上图由下图中的链接地址跳转过来
当top命令看到系统的sys时间较高,想了解代码的实际运行内容:查看用什么参数打开了什么文件、读取写入的内容、socket参数等等
可以用strace分析工具跟踪进程及其子进程的系统调用,即# strace -fF -p ${PID} -o strace.log,跟踪新启动进程# strace -fF -o strace.log 要运行的命令。
网卡监控netstat -ant着重参考下标注
其他常用命令:iostat nload tcpdump
tcpdump -nn -i eth0 -xX -s 0 tcp and port 2181
-nn 制定抓包时不需要反解各个IP的域名
• -i 指明要侦听的网络接口,需要注意的是如果是本机连本机的话,即便是用的不是”127.0.0.1”,也是走的lo接口
• -xX 说明需要显示包的内容,默认是不显示的
• -s 0 指定每个包内取多少字节,0表示无上限,默认是128字节