时间和篇幅有限,简单写几点,主要是阐述思路。
1、首先关注服务器层面,看CPU、内存、IO、网络吞吐情况
常用的linux命令如: top、vmstat、sar、iostat 等,这些是我经常用的
常用的工具如:nmap等,网上搜一下可以找到很多,不具体说了。
2、CPU高分析
CPU高是大多数造成性能低下的原因,C和java的分析方法有所不同
java参照前面文章:https://blog.youkuaiyun.com/flyingfairy123/article/details/100543593
C主要分析一下进程栈,常用命令如:strace,观察日志分步耗时(如果有)等
需要分析耗时长的调用或方法,通常包括 数据库访问、连接池、短链接、频繁的线程切换、频繁的内存创建、回收寻址等
常用的策略:1)查询查备库(基本),减少数据库交互次数,基础数据缓存,同行数据不多次查询等
2)池化资源,数据库连接池、线程池等
3、内存分析
网上工具很多,不具体展开,只说一点,写代码尽量避免内存过渡使用,代码和设计要严谨,即使现在的硬件成本越来越低,不光是堆空间使用开销大,高并发下栈空间同样会对性能产生较大影响
4、IO分析
大量写文件导致,比如日志,参考操作系统中对文件系统的处理,缓存处理必不可少,还可异步处理(如日志服务器)
5、网络分析
流量可以测试计划编写时大致计算
6、其它
常见的部署架构优化如存储分块(一个产品存储的io上线是固定的,一块分多块可提高io)、数据库分组(也是拆分的概念)等等,总之:都离不开 减少系统调用、合理使用内存、缓存、池化、分拆、异步、降低数据库访问频次 等基本原则。
附:
C程序的的排查过程:
调试过程:查看cpu高的进程-->线程-->线程函数调用栈-->函数耗时和调用统计-->分析代码
查看进程: top
查看线程: top -H -p id
查看线程函数调用: gstack id
转存进程映像和内存上下文: gcore id
函数耗时和调用统计: strace -T -r -c -p xxxx
调试core文件: gdb 进程 corefile 后 thread id