• 性能定位的一些方法


    问题背景:

    Tps约50左右,10线程与50线程压测tps一致,只响应时间不断增加,数据库服务器资源占用较低,而应用服务器cpu维持在一定值之后随着并发数增加,cpu不再增高,凭经验判断,应该跟代码实现有关;

    所以直接找引发问题的代码;

    快速手段如下:

    使用top命令查看当前进程的资源占用情况,通过下图我们看到PID为4501的进程为java的主要活动进程

     使用top –Hp 4501来查看-H 显示线程 -p 指定pid   如果执行上述命令之后,发现还是只有一行,那么按下 shift+h, 即可显示线程占用资源情况,此处占用CPU最高的线程的PPID是15894

    扑捉到线程后,需jstack跟踪,此时线程号转化为16进制,

    使用命令 jstack 4501 |grep -i 3e16   来查询进程详细信息

    此时与开发沟通,在代码实现中,在合并账户加锁,在并发中,导致大量线程等待,后来通过锁账户改成锁收据单,锁粒度降低,改完后,重新测试,tps达到300,随着并发数增加,cpu资源升高,根据硬件消耗与tps对比,达到正常;

    在举一例

    定时任务,执行时间过长;

    经过监控,内存瞬间达到极致,回收缓慢,程序卡顿严重,通过jmap(上述类似方法,也可以jvisual)追踪代码,某方法再一次执行中提交大量数据,后经与开发讨论修改数据量,并反复压测验证,达到最优配置,从原来的20min执行时间缩短为2min,且内存回收正常(如下图);

  • 相关阅读:
    矩阵乘法(二):利用矩阵快速幂运算完成递推
    更改codeblock编译后程序的图标
    如何在VS2008下使用FLTK
    Python type() 函数
    Python range() 函数用法
    Python len()方法
    Python filter() 函数
    Python bool() 函数
    数据类型
    JAVA标识符
  • 原文地址:https://www.cnblogs.com/changyou615/p/8919037.html
Copyright © 2020-2023  润新知