应用服务器调优案例分析

应用服务器调优案例分析


某企业、公司随着业务发展,生产环境经常会出现服务器负荷太高,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

扫描二维码关注公众号,回复: 6129712 查看本文章

使用分析工具进行分析内存如:

Eclipse Memory Analyzer / IBM HeapAnalyzer

推荐前者,在ecplise、idea 在线、离线安装插件

收集Dump文件有两种方式:

  1. 服务器内存溢出自动生成Dump文件
    . 设置JVM启动参数
    -XX:+HeapDumpOnOutOfMemoryError
    -XX:HeapDumpPath=/zachary/jvm

  2. 在线生成dump文件
    jmap -dump:format=b,file=heapDump_xxx pid

分析Dump文件如下
主界面

打开Dump文件,显示主界面,目前应用堆内存 800多M, Leak Suspects可以 查看问题详情,如下
问题详情
两个问题,问题A、B各占内存如上
问题详情
进一步跟踪问题,点击Details

问题1

静态类、字节占用太多堆内存空间,查看树形结构Histogram

树形结构1

查看线程栈视图 dominator_tree

线程栈
从上面的截图中可以得出如下关键信息点:

  • 页面频繁请求应用,导致应用过度消耗内存,优化页面请求,缓存本地
  • 应用内存分配不均,调整应用内存、JVM堆内存

总结

针对应用服务器调优,通过监控发现应用状态,然后通过Top命令找到相应负荷大的进程,CPU过高可以通过jstack命令分析其线程状态调优,内存过高可以通过jmap导出
,专业分析工具进行跟踪分析,大部分情况是应用程序低效导致,不断发现问题进行优化,达到高效状态,保证系统稳定运行…

作者简介:张程 技术研究

更多文章请关注微信公众号:zachary分解狮 (frankly0423)

公众号

猜你喜欢

转载自blog.csdn.net/qaz7225277/article/details/89358740