【优化技术专题】「系统性能调优实战」终极关注应用系统性能调优及原理剖析(上册)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【优化技术专题】「系统性能调优实战」终极关注应用系统性能调优及原理剖析(上册)

背景介绍


  1. 本人是做呼叫中心服务的,但是最近需要将系统性能和吞吐提升更高的能力和层次,所以便进行先关系统性质的学习和优化相关的技术做了一定的研究。




调优背景


因为当出现吞吐远远不能够满足我们客户或者我们需要的呼叫了指标的时候因为出现了这么一次情况,虽然没有给用户没有给公司带来什么损失,但是该现象从侧面已经反应出了系统某些方面的问题,或许系统参数需要优化一番,或许系统设计交互需要优化一番,或许等等等的可能,才有了后续系统调优的历程。




计划优化的要点方向


  1. 流程相关分析优化:看看哪些流程可以同步转异步处理,可以梳理一下哪些请求可以合并起来,Server服务端的哪些业务场景需要补偿机制等。


  1. 数据库相关分析优化:哪些Sql耗时较长,哪些方法可以去除事务且去除事务后的带来的问题场景分析,数据库连接池参数是否合理,数据库本身相关参数的阈值情况的一些综合考虑;


  1. 内存使用情况分析优化:新老年代内存使用率及回收情况,CPU使用率,磁盘使用率,swap区使用情况, 线程dump,堆dump。


  1. JVM参数分析调优:YGC的平均耗时,YGC的平均间隔,FGC的平均耗时,FGC的平均间隔等等,根据具体情况反映具体问题;


  1. TCP/Tomcat参数分析调优:这个得根据实际压测情况来相应评估是否需要调整;




Linux命令相关查看指标


CPU 指标

每n秒采集一次,一共采集m次
vmstat n m
复制代码


  • r表示运行队列,r值一般负载超过了3就比较高,超过了5就高,超过了10就不正常了;
  • bi和bo一般都要接近0,不然就是IO过于频繁
[root@svr01]$ vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0 206944 633564  29876 1252176    0    0    10    27    0    0  1  1 98  0  0
0  0 206944 634232  29876 1252192    0    0     0     0  811 1504  1  1 98  0  0
0  0 206944 634480  29876 1252264    0    0     0     0  951 1458  6  1 93  0  0
复制代码



uptime


最近1分钟,5分钟,15分钟的系统平均负载。

  • <=3 则系统性能较好。
  • <=4 则系统性能可以,可以接收。
  • 大于5 则系统性能负载过重,可能会发生严重的问题,那么就需要扩容了,要么增加核心数量
[root@svr01]$ uptime
21:27:44 up 207 days, 11:15, 1 user, load average: 26.45, 16.76, 7.50
复制代码



top


主要看us和sy,其中us<=70,sy<=35,us+sy<=70说明状态良好,同时可以结合idle值来看,如果id<=70 则表示IO的压力较大。




4.2 Memory 指标


vmstat

  • swpd:虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了
  • si:每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
  • so:每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上,单位为KB。
[root@svr01]$ vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0 206944 633564  29876 1252176    0    0    10    27    0    0  1  1 98  0  0
0  0 206944 634232  29876 1252192    0    0     0     0  811 1504  1  1 98  0  0
0  0 206944 634480  29876 1252264    0    0     0     0  951 1458  6  1 93  0  0
复制代码



Disk 指标


df

Use%:已使用占比,Use% <= 90% 表示还勉强接受正常

[root@svr01]$ df
  Filesystem           1K-blocks     Used Available Use% Mounted on
  /dev/mapper/VolGroup00-LVroot
 17737040  4286920  12542448  26% /
  tmpfs                  1893300        0   1893300   0% /dev/shm
  /dev/sda1               194241   127341     56660  70% /boot
  /dev/mapper/VolGroup00-LVhome
487652     2348    459704   1% /home
  /dev/mapper/VolGroup00-LVcloud
3030800   260440   2613076  10% /opt/cloud
  /dev/mapper/VolGroup00-LVtmp
  8125880    18724   7687728   1% /tmp
  /dev/mapper/VolGroup00-LVvar
 25671996   848996  23512280   4% /var
  /dev/mapper/VolGroup1-LVdata1
  41149760 33707952   5344864  87% /wls/applogs 
复制代码


Disk IO 指标


sar -d 1 1:查看磁盘报告 1 1 表示间隔1s,运行1次


  • 如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。
  • 如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷的在工作,该磁盘请求饱和,可能存在瓶颈。
  • idle小于70% I/O压力就较大了,也就是有较多的I/O。
[root@svr01]$ sar -d 1 1
  Linux 2.6.32-642.6.2.el6.x86_64 (SHB-L0044551) 07/20/2018 _x86_64_ (1 CPU)
  03:00:23 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
  03:00:24 PM dev252-0 23.00 808.00 80.00 38.61 9.88 375.35 43.48 100.00
  03:00:24 PM dev252-16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  03:00:24 PM dev253-0 4.00 448.00 0.00 112.00 1.11 222.00 249.50 99.80
  03:00:24 PM dev253-1 50.00 400.00 0.00 8.00 24.40 523.20 20.00 100.00
  03:00:24 PM dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  03:00:24 PM dev253-3 3.00 32.00 0.00 10.67 0.99 242.33 331.67 99.50
  03:00:24 PM dev253-4 0.00 0.00 0.00 0.00 1.61 0.00 0.00 100.00
  03:00:24 PM dev253-5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  03:00:24 PM dev253-6 3.00 0.00 24.00 8.00 1.30 393.67 261.33 78.40
  Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
  Average: dev252-0 23.00 808.00 80.00 38.61 9.88 375.35 43.48 100.00
  Average: dev252-16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  Average: dev253-0 4.00 448.00 0.00 112.00 1.11 222.00 249.50 99.80
  Average: dev253-1 50.00 400.00 0.00 8.00 24.40 523.20 20.00 100.00
  Average: dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  Average: dev253-3 3.00 32.00 0.00 10.67 0.99 242.33 331.67 99.50
  Average: dev253-4 0.00 0.00 0.00 0.00 1.61 0.00 0.00 100.00
  Average: dev253-5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  Average: dev253-6 3.00 0.00 24.00 8.00 1.30 393.67 261.33 78.40
复制代码



4Network IO 指标


netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn

在不考虑系统负载、CPU、内存等情况下,netstat监控大量ESTABLISHED连接与Time_Wait连接

[root@svr01]$ netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
265 TIME_WAIT
 45 ESTABLISHED
 38 CLOSE_WAIT
 18 LISTEN
  8 FIN_WAIT2
  2 SYN_SENT
  1 Foreign
  1 established)
复制代码




关于统计的量化指标


注意:有些命令通用,有些是我根据系统的日志文件格式利用awk/sed两个命令结合写出来的。


  1. netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn ( 查看TCP连接状态 )
  2. netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20( 查找较多time_wait连接 )
  3. netstat -anlp|grep tcp |awk '{print 5}' |awk -F':' '{print 1}' |uniq -c |sort -nr | head -n3( 查出访问靠前的IP地址 )
  4. cat hmilyylimh_sql.log | awk '{print 6}' | awk -F'ms' '{print 1}' | awk -F'=' '{print $2 | "sort -r -n"  }' | head -n5( 查询sql文件中耗时最高的前5个耗时数据值 )
  5. cat hmilyylimh_supp.log | awk '{print 10}' | awk -F'timeConsuming=' '{print 2 }' | awk -F'ms' '{print $1 | "sort -r -n" }' | head -n5( 查看supp文件中耗时最高的前5个耗时数据值 )
  6. cat hmilyylimh_sql.log | grep 'sql:=' | awk '{print $5}' | uniq -c | sort -rn | head -n2( 查询sql文件总共打印了多少条SQL日志 )
  7. cat hmilyylimh_sql.log | grep 'NormalTimeConsuming' | awk '{print $5}' | uniq -c | sort -rn | head -n2( 查看sql文件成功执行了多少条SQL日志 )
  8. cat hmilyylimh_sql.log | grep 'BadTimeConsuming' | awk '{print $5}' | uniq -c | sort -rn | head -n2( 查看sql文件失败或者异常执行了多少条SQL日志 )
  9. cat hmilyylimh_supp.log | grep 'sendReqSupp start'| awk '{print 6667$8}' | uniq -c | sort -nr | head -n2( 查询supp文件sendReqSupp start字符串出现的次数 )
  10. lsof -n | awk '{print 1,1,1,2}' | sort | uniq -c | sort -nr | head -n10( 统计持有各个进程持有句柄数最高的10个 )
  11. lsof -n | awk '{print 1,1,1,2}' | sort | uniq -c | sort -nr | awk '{ sum+=$1 };END { print sum } '( 计算所有进程持有句柄数的总和,ulimit -n命令查看最大句柄数 )
  12. lsof | awk 'NF == 9 { print $0}' | sort +6 -7nr | head -n10( 查看系统打开的大文件列表 )
  13. top -b -n 1 | grep -E 'Cpu(s)|Mem|Swap'( 一次性查出系统当前的CPU、内存、交换区的情况 )
  14. iostat -p sda | awk -F'Device' '{ print $1 }'( 查看cpu的统计信息(平均值) )
  15. cat access_log.date +%Y%m%d.txt | awk '{print $6}' | uniq -c | sort -k2 -r | head -n10( 统计每秒请求并发,按照时间降序排列 )
  16. cat access_log.date +%Y%m%d.txt | awk '{print $6}' | uniq -c | sort -rn | head -n10( 统计每秒并发,按照并发量降序排列 )
  17. cat access_log.date +%Y%m%d.txt | awk '{ sum+=$NF }; END { print sum*2/8/1024/1024, "M" }'( 查看访问hmilyylimh服务器每天的总流量 )
  18. cat gc.log | tail -n20|awk '{print 4}'| awk -F'->' '{print 1, 2,2, 2,3 }'| awk -F'(' '{print 1,1, 1,2, 3}' | awk -F')' '{print 1}' | awk -F'K' '{print 1/1/1/3100,  "% used  ->     "  ,2/2/2/3100, "% used     " , 100-2/2/2/3*100, "% free      ",  $3/1024, "M total     ---    新生代" }'( 查看gc指标,新生代最后n条记录的新生代内存变化率 )
  19. cat gc.log | tail -n20 | awk '{print 7}' | awk -F'->' '{print 1, 2,2, 2,3 }' | awk -F'(' '{print 1,1, 1,2, 3}' | awk -F')' '{print 1}' | awk -F'K' '{print 1/1/1/3100,  "% used  ->     "  ,2/2/2/3100, "% used     " , 100-2/2/2/3*100, "% free      ",  $3/1024, "M total     ---    堆内存" }'( 查看最后10条GC日志的堆内存已使用转化率 )
  20. cat /etc/sysctl.conf | grep 'tcp_'( 查看TCP参数设置信息 )
  21. cat hmilyylimh.log | awk '{if(2>"15:17:00.236")print2>"15:17:00.236") print 2>"15:17:00.236")print0}' | grep "max_user_connections" | wc -l( 查看具体时间点后某个字符串出现的次数 )




六、系统常用计数器命令


1、echo "<<<<<<<<<<<<<< 线程阻塞等待计数: "`less hmilyylimh_error.log | grep "with callerRunsPolicy" | wc -l`",   ""db事务嵌套锁AcquireLock计数: "`less hmilyylimh_error.log | grep "CannotAcquireLockException" | wc -l`",   ""创建事务异常计数: "`less hmilyylimh_error.log | grep "CannotCreateTransactionException" | wc -l`",    ""db连接池溢出计数: "`less hmilyylimh_error.log | grep "more than 'max_user_connections'" | wc -l`",    ""Pool Empty计数: "`less hmilyylimh_error.log | grep "Unable to fetch a connection" | wc -l`" >>>>>>>>>>>>>>"
2、echo "<<<<<<<<<<<<<< UnknownHostException计数: "`less hmilyylimh_error.log | grep "UnknownHostException" | wc -l`",   ""ConnectionPoolTimeout计数: "`less hmilyylimh_error.log | grep "ConnectionPoolTimeout" | wc -l`",   ""ConnectException计数: "`less hmilyylimh_error.log | grep "ConnectException" | wc -l`",   ""ConnectTimeoutException计数: "`less hmilyylimh_error.log | grep "ConnectTimeoutException" | wc -l`",   ""SocketTimeoutException计数: "`less hmilyylimh_error.log | grep "SocketTimeoutException" | wc -l`",   ""OtherException计数: "`less hmilyylimh_error.log | grep "OtherException" | wc -l`" >>>>>>>>>>>>>>"
3、echo "<<<<<<<<<<<<<< Sql耗时最高的前5个数值: "`cat hmilyylimh_sql.log | awk '{print $6}' | awk -F'ms' '{print $1}' | awk -F'=' '{print $2 | "sort -r -n"  }' | head -n5`",   ""Supp耗时最高等待前5个数值: "`cat hmilyylimh_supp.log | awk '{print $10}' | awk -F'timeConsuming=' '{print $2 }' | awk -F'ms' '{print $1 | "sort -r -n" }' | head -n5`" >>>>>>>>>>>>>>"
4、echo "<<<<<<<<<<<<<< Http请求耗时最高前10个数值: "`less hmilyylimh.log | grep "timeConsuming=" | awk '{print $9}' | awk -F'=' '{print $2}' | awk -F'ms' '{print $1 | "sort -r -n"  }' | head -n10`" >>>>>>>>>>>>>>"




相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
21小时前
|
缓存 算法 数据库
性能优化实战——从理论到实践
性能优化实战——从理论到实践
8 1
|
3月前
|
缓存 前端开发 JavaScript
Rails应用慢如蜗牛?揭开数据库到前端的全方位性能优化秘籍,从此告别龟速加载!
【8月更文挑战第31天】本文探讨了Ruby on Rails应用的性能优化方法,涵盖数据库查询与前端渲染。通过具体代码示例,介绍了如何使用`includes`避免N+1查询问题,利用缓存机制提高效率,以及通过合并和压缩CSS及JavaScript文件优化前端渲染。这些技巧有助于全面提升应用性能和用户体验。
47 1
|
6月前
|
运维 监控 Java
【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你深度剖析Java线程转储分析的开发指南
学习JVM需要一定的编程经验和计算机基础知识,适用于从事Java开发、系统架构设计、性能优化、研究学习等领域的专业人士和技术爱好者。
104 5
【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你深度剖析Java线程转储分析的开发指南
|
6月前
|
存储 缓存 监控
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(场景问题分析+性能影响因素)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(场景问题分析+性能影响因素)
111 0
|
6月前
|
移动开发 网络协议 Shell
最强优化指令大全 | 【Linux技术专题】「系统性能调优实战」终极关注应用系统性能调优及原理剖析(下册)(一)
最强优化指令大全 | 【Linux技术专题】「系统性能调优实战」终极关注应用系统性能调优及原理剖析(下册)
61 0
|
6月前
|
消息中间件 缓存 监控
阿里P8整理的《百亿级并发系统设计》实战教程,实在是太香了
说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了。为啥?因为你没看到现在很多公司招聘的 JD 里都是说啥有高并发经验者优先。
|
SQL 缓存 负载均衡
项目高并发问题解决方案合集
这道题是比较典型的题吧,也是我第一个公司入职的时候,面试官问我的,当时我回答只能说是星星之火,还不能燎原那种,差点被面试官给浇灭。
109 0
|
监控 网络协议 Java
【深入了解系统性能优化】「实战技术专题」全方面带你透彻探索服务优化技术方案(系统服务调优)
系统运行缓慢,执行速度较差虽然没有对用户或公司造成实质性的损失,但它从侧面反映出系统在某些方面存在问题。可能需要对系统参数进行优化,或者对系统的设计和交互进行调整,这是后续系统性能优化的一个重要过程。我们将继续努力优化系统,以确保其高效运行和良好性能,以提升用户体验并最大程度地满足业务需求。我们希望通过系统调优的历程,解决当前存在的问题,并不断改进系统的运行,为用户提供更好的服务。
356 0
【深入了解系统性能优化】「实战技术专题」全方面带你透彻探索服务优化技术方案(系统服务调优)
|
设计模式 缓存 Java
好家伙!阿里新产Java性能优化(终极版),涵盖性能优化所有操作
上月公司来了一位大佬,入职不到一周就把公司现有项目的性能优化了一遍,直接给公司节省了一半的成本。 一问情况,才知道这位仁兄也是一路被虐过来的。去年年底被裁,本以为自己技术还行,看了一段时间面经,复习了基础知识,就开始投大厂简历。阿里最先给他面试机会,结果没能扛过三面,然后是各种大大小小的公司,在实际面试中被碾压得翻不了身。整整一个半月,一个offer都没拿到,最后针对性的恶补,才入职了我司。
化繁为简!阿里新产亿级流量系统设计核心原理高级笔记(终极版)
不管是初入职场的小菜鸟还是有一些工作年限的老司机,系统设计问题对他们来说都是一大困扰。前者主要是在于面试;面试官来一个如何从零到一设计一个完整的系统?大多数人都会直接懵了,因为系统设计覆盖面广,而网上资料又不能面面俱到,单独背背文章肯定是不行的;后者主要在于晋升;想要从程序员进阶到架构师,系统设计是必须要踏入的一道坎,他对你的技术广度跟深度都会有一定程度的考察。