一:线上问题排查
比如server有进程出现core
方法1:打开coredump,生成core文件,方便调试(也可拉倒线下调试)。
方法2:安装tcpcopy,将线上流量导到线下机器进行进行调试。
方法3:分析是否有多线程其中的部分线程退出导致其他线程出core等等
比如线上流量很少,但是server却像处理不过来
方法1:pstack查看进程都在干什么,阻塞在哪里,并对照代码分析。
方法2:查看网络tcp状态,查看服务进程都处于什么状态。
方法3:使用tcpdump分析网络状态。
最后排查到是和系统设置有关:
netstat -n | grep 183.136.237.226:80 | awk '/^tcp/ {++S[$NF]} END {for (a in S) print a, S[a]}'
修改系统网络参数:
net.ipv4.tcp_max_syn_backlog = 10240(默认1024,需调大)
net.core.somaxconn = 10240(默认128,需调大)
二:常见性能问题解决方法:
1:使用工具运行程序,gprof,Valgrind和Purify可以作为性能检测工具,检测出每个函数的运行时间和处理过程中所占比重。
2:查看在运行过程中所占比重大的函数,分析每个函数占比重大的原因,讨论改进方法并进行修改。
3:重新测试看是否达到效果,重复1,2,3
小提示:linux下程序编译的时候加上-O2,程序性能可以提高至少10%以上,如果程序中没有对象池,使用tcmalloc也能提高10%到15%的效率。
内存泄露,越界问题排查
1:使用valgrind运行程序,从线上tcpcopy部分流量过来,将valgrind运行结果存入到文件中。
2:逐条分析valgrind提示内存泄露或者越界的地方,看是否有释放内存的地方,或者是否真的越界,如有则修正
3:修正之后出新版本,重复1,2,3
4:top命令观察一段时间发现没有内存增加或者处理出错的时候则说明问题解决。