设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 数据 手机 公司
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

快被系统性能逼疯了?你需要这份性能优化策略(2)

发布时间:2019-01-05 06:00 所属栏目:117 来源:dbaplus社群
导读:通过DB2数据库快照查看执行时间长的SQL,查看该SQL执行计划,在cost比较高的SQL上增加合适索引。要求所有大表SQL执行计划的cost低于100,超过100的SQL要评审。对于排序溢出、可参考数据中心规范设置排序堆大小,规

通过DB2数据库快照查看执行时间长的SQL,查看该SQL执行计划,在cost比较高的SQL上增加合适索引。要求所有大表SQL执行计划的cost低于100,超过100的SQL要评审。对于排序溢出、可参考数据中心规范设置排序堆大小,规范中排序堆设置为AUTOMATIC。

  • 制定数据库表清理策略。根据数据的生命周期要求,对流水类的数据定期进行清理备份,不再长期保留。定期对全库的表结构进行reorg、runstats操作,以提高索引效率。

  • 排查方法:

    • 获得数据库快照:db2 get snapshot for all on corpdb >gswyzfzzshpl1207.log

    • 从快照中提取慢SQL,Toad查看SQL执行计划

    • Db2命令方式查看SQL执行计划:db2expln -d corpdb -t -g -q "SQL语句"

    • 执行计划查看方法:自上而下查看cost最大的分支,找到未走索引或索引使用不当的表

    2、数据库出现死锁

    问题现象:数据库快照检测到存在数据库死锁,或通过db2evmon -db corpdb -evm DB2DETAILDEADLOCK>dlock.txt生成死锁监控文件,快照或监控文件中存在deadlock的情况。

    问题原因:全表扫描、大事务、更新相同表记录的SQL执行顺序交叉等。

    解决方法:缩短事务路径长度,避免全表扫描。如果必须存在大事务,则更新相同表的SQL执行顺序一致,并且坚决避免全表扫描。网银系统指令发送功能全表扫描+全局大事务,导致数据库死锁。

    排查方法:根据死锁监控文件dlock.txt找到导致死锁的SQL,以及该SQL持有的锁,分析该SQL可能存在的问题。

    3、线程阻塞在日志记录上

    问题现象:系统响应时间长、通过javacore查看很多线程阻塞在打印日志上。

    问题原因:log4j1.x版本较低,性能较差;大报文日志多次输出。

    解决方法:

    • 减少无效日志、删除无用日志,减少大日志输出。

    • 升级log4j组件到log4j2,参考log4j2官方文档,配置合理的日志缓冲区,采用高效的Appenders,比如RollingRandomAccessFile。但log4j2仍然采用同步日志,不采用异步日志。因为网银系统日志量较大,异步日志队列很快就满了,如果单条日志存在大报文,还有可能导致内存溢出,因此不适合采用异步日志。如果日志量少(压测产生日志的速度,低于日志写入文件的速度),则可以使用异步日志,大幅提高性能。如果日志量较大,则不建议使用异步日志。

    排查方法:

    • JVM启动参数中增加-XX:+HeapDumpOnCtrlBreak,压测进行时,kill -3 pid 杀几个javacore,使用jca457.jar工具打开并分析。推荐使用该工具,因为该工具可以对所有线程状态进行统计,并生成饼状图,方便查看。

    • 压测进行时,使用jvisualvm获取jvm快照,分析线程堆栈。

    4、多线程并发问题

    问题现象:采用合理的并发数压测,系统出现逻辑错误、交易失败或异常报错。经查是由于对象中变量被异常修改导致。

    问题原因:系统中全局对象中的类变量或全局对象,被多个线程修改。

    解决方法:排查系统中所有持有全局对象或类变量的代码,检查其全局变量是否可能被多个线程并行修改。

    修改方法:

    • 将全局变量转成方法内的局部变量;

    • 对全局变量进行同步控制比如syncronized代码块,或者java.util.concurrent锁。

    排查方法:并发问题很可能是由全局变量或者对象导致,准确识别全局变量,通过阅读代码找问题。建议应用梳理所有可能存放全局对象的代码,统一管控,或者把所有全局对象放到一个类中,方便管理。

    5、打开了太多文件

    问题现象:采用合理的并发数压测,交易失败,或后台日志报错:To many open files。

    问题原因:

    • 读取配置文件或者业务数据文件后,未关闭文件流;

    • /etc/security/limits.conf中最大打开文件数配置过小。

    解决方法:

    • 使用lsof –p pid 命令查看进程打开的文件,如果大部分文件都是同一类型的文件,说明可能未关闭文件流。找到打开文件的代码,关闭文件流即可。

    • 如果不存在未关闭文件流的问题,且业务本身就需要处理大量文件,则修改/etc/security/limits.conf文件如下内容:

    * hard nproc 10240

    * soft nproc 10240

    6、内存泄漏

    问题现象:JVM内存耗尽,后台日志抛出OutOfMemeryError异常 ;

    问题原因:内存溢出问题可能的原因比较多,可能是全局的List、Map等对象不断被扩大,也可能是程序不慎将大量数据读到内存里;可能是循环操作导致,也可能后台线程定时触发加载数据导致。

    解决方法:对于ibmjdk纯java应用,在jvm启动时设置-XX:+HeapDumpOnOutOfMemory Error参数,会在内存溢出时生成heapdump文件。使用ha456.jar工具打开heapdump文件,分析大对象是如何产生的。

    当然,在heapdump中对象类型可能只是List这种结构,看不出具体哪个业务代码创建的对象。此时要分析所有的全局对象,列出可疑的List或Map对象,排查其溢出原因。

    全局对象、引用的初始化、修改要慎重。建议应用梳理所有可能存放全局对象的代码,统一管控。

    7、JVM垃圾回收频繁

    问题现象:top –H –p pid命令查看,GC Slave线程CPU占用排名始终为前三名,同时Jconsole查看jvm内存占用较高,垃圾回收频繁。使用ga456.jar分析gc日志,查看gc频率、时长。

    打印gc日志的方法:在jvm启动参数里增加-verbose:gc -Xverbosegclog:/usr/ebank/ logs/cobp/gcdetail.log

    问题原因:高并发下,内存对象较多,jvm堆内存不够用 。

    解决方法:扩大堆内存大小–Xmx2048m –Xms2048m。

    8、CPU高

    问题现象:50并发压测,监控工具显示bp、前置CPU占用90%以上。

    问题原因:业务处理中存在大量CPU计算操作。

    (编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读