应用服务器调优案例分析
某企业、公司随着业务发展,生产环境经常会出现服务器负荷太高,CPU持续飙升现象、内存溢出,当出现这种现象如何快速定位问题并分析处理呢?
接下来将通过实例 分析说明
分析思路:
- 应用程序CPU持续飙升,一般线程堵塞未释放、死锁
- 请求流量某时间段高额,低性能应用程序引起
- 垃圾回收时间停顿时间过长、内存溢出等问题引起的
定位问题:
通过监控工具Zabbix查看应用的TCP连接数、线程数处于状态分析应用目前可能出现场景,如(外部攻击、木马程序、劫持、注入等),同时打开应用服务器先用ps命令查看服务器目前使用率最高的应用PID
接着使用 top -Hp pid 将这个进程的线程显示出来。输入大写的 P 可以将线程按照 CPU 使用比例排序,如下结果。
发现某些进程CPU高额
接着保存目前进程使用率高额的线程信息 jstack pid > thread_194283.log 将线程栈 信息存储到日志文件,如下结果
由于thread_194283.log 存储是16进制格式,此时需要把当前pid 转成相应格式,使用如下命令 printf “%x\n” pid ,结果是0x55ef,对应以上文件内容
发现其中有个业务多线程批量生成二维码,由于批次数和线程堵塞数不一致导致线程
一直处于等待状态,迟迟未释放资源,修复后CPU恢复正常,如下
针对 内存频繁开销很大优化过程如下
使用命令把应用程序导出标准文件
jmap -dump:format=b,file=heapDump_194283 pid
使用分析工具进行分析内存如:
Eclipse Memory Analyzer / IBM HeapAnalyzer
推荐前者,在ecplise、idea 在线、离线安装插件
收集Dump文件有两种方式:
-
服务器内存溢出自动生成Dump文件
. 设置JVM启动参数
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/zachary/jvm -
在线生成dump文件
jmap -dump:format=b,file=heapDump_xxx pid
分析Dump文件如下
打开Dump文件,显示主界面,目前应用堆内存 800多M, Leak Suspects可以 查看问题详情,如下
两个问题,问题A、B各占内存如上
进一步跟踪问题,点击Details
静态类、字节占用太多堆内存空间,查看树形结构Histogram
查看线程栈视图 dominator_tree
从上面的截图中可以得出如下关键信息点:
- 页面频繁请求应用,导致应用过度消耗内存,优化页面请求,缓存本地
- 应用内存分配不均,调整应用内存、JVM堆内存
总结
针对应用服务器调优,通过监控发现应用状态,然后通过Top命令找到相应负荷大的进程,CPU过高可以通过jstack命令分析其线程状态调优,内存过高可以通过jmap导出
,专业分析工具进行跟踪分析,大部分情况是应用程序低效导致,不断发现问题进行优化,达到高效状态,保证系统稳定运行…
作者简介:张程 技术研究
更多文章请关注微信公众号:zachary分解狮 (frankly0423)