3.1.3 云上大型赛事系统调优
本节讨论针对压测时遇到的具体问题如何进行系统调优。
3.1.3.1 常见问题及应对
3.1.3.1.1 压测机和服务端问题
压测机和服务端上产生的问题通常是系统瓶颈问题,例如压测机发包速率上不去、服务端队列溢出、服务端Conntrack表项打满等等,这些系统内问题一般都会有相应的性能指标指示,我们可以通过通用的系统性能问题排查方法找到瓶颈点,并做对应的调整。
Linux系统下常见的排查手段命令如下:
top命令可以动态查看当前系统的资源情况,以及占用资源的命令列表。
dmesg ==> /var/log/dmesg命令可以快速查看系统启动过程中的内核日志信息,包括:系统设备信息、启动和操作过程中系统记录的任何错误和问题。
vmstat 1 5命令输出系统核心指标信息,1 5 表示1秒输出5次信息。
mpstat -P ALL 1命令可显示CPU的个数,以及每一个CPU被占用的状况,如果有一个CPU占用率特别高,那么有可能是一个单线程应用程序引起的。
pidstat 1输出进程的CPU占用率{会持续输出,并不会覆盖之前的数据}。
iostat -zx 1查看机器磁盘IO情况。
sar -n DEV 1 查看网络设备的吞吐率。
sar -n TCP,ETCP 1 查看TCP连接状态。
systcl -a | grep ipv4 查看Linux系统网络相关内核参数。
netstat -tan |grep ^tcp |awk '{++a[$6]} END{for (i in a) print i, a[i]}' 统计Linux系统不同状态的tcp连接数。
netstat -st | egrep -i "drop|reject|overflflowed|listen|fifilter" 显示系统队列溢出、丢包计数。
Windows系统常见的排查工具如下:
Task1Manager提供一些排查通用信息,包括系统整体资源利用率、各进程资源占用率、注册服务信息等。
Resource1Monitor可实时监控系统详细性能,包括CPU、内存、磁盘IO和网络。
Event1Log检查操作系统各组件日志,包括系统日志、应用程序日志和服务日志。
Regedit检查系统注册表。注册表实质上是一个庞大的数据库,它存储和管理关于系统的一切信息。
Process Explorer为Microsoft提供的Sysinternals工具,可以检查各进程详细信息和hook信息、句柄信息。
Process Monitor为Microsoft提供的Sysinternals工具,可以捕获进程的大多数操作数据。
WinDbg为Mircosoft提供的GUI调试器,可以调试应用程序,或者提供Windows操作系统的Kernel Debug。
CPU瓶颈常见考量点:
CPU资源利用率很高的话,需要看CPU消耗User、Sys、Wait哪种状态。
如果CPU1User非常高,需要查看消耗在哪个进程,可以用top(Linux)命令看出,接着用top–H–p看哪个线程消耗资源高。如果是Java应用,就可以用jstack看出此线程正在执行的堆栈,看资源消耗在哪个方法上,查看源代码就知道问题所在;如果是c++应用,可以用gprof性能工具进行分析。
如果CPU Sys非常高,可以用strace(Linux)看系统调用的资源消耗及时间。
如果CPU1Wait非常高,考虑磁盘读写了,可以通过减少日志输出、异步或换速度快的硬盘。
内存瓶颈常见考量点:
操作系统为了最大化利用内存,一般都设置大量的cache,因此,内存利用率高达99%并不是问题,内存的问题主要看某个进程占用的内存是否非常大以及是否有大量的swap(虚拟内存交换)。
磁盘I/O常见考量点:
磁盘I/O一个最显著的指标是繁忙率,可以通过减少日志输出、异步或换速度快的硬盘来降低繁忙率。
网络I/O常见考量点:
网络I/O主要考虑传输内容大小,不能超过硬件网络传输的最大值70%,可以通过压缩减少内容大小、在本地设置缓存以及分多次传输等操作提高网络I/O性能。
内核参数:
内核参数一般都有默认值,这些内核参数默认值对于一般系统没问题,但是对于压力测试来说,可能运行的参数将会超过内核参数,导致系统出现问题,可以用sysctl来查看及修改。
3.1.3.1.2 中间件问题
中间件问题通常是超限问题,例如SLB1QPS超限、nginx节点不足、EIP流量超限、JDBC连接池不足等等,可以通过组件监控指标查看到,一般是通过升配(Scale up)或者扩容(Scale out)解决。
3.1.3.1.3 数据库问题
数据库层面需要关注慢SQL、死锁等等。最常见发生的就是慢SQL问题。
索引
最常见的情况是在数据量比较大的情况下,应用程序的SQL语句未建立索引,或者未能利用索引,产生了全表扫描。
带有NULL会导致索引性能低。例如表中有空NULL值或者语句中有IS NULL或IS NOT NULL。
锁
如SQL语句产生表级锁,将会锁住整个表,导致性能恶化。
创建临时表会产生大量日志也可能会导致性能恶化。
以上问题可以通过具体的SQL语句调整解决。
3.1.3.1.4 应用侧问题
应用侧本身问题包括GC/FULL1GC频率过大、应用线程池不足等问题,需要检查应用端代码解决。
《云上大型赛事保障白皮书》——第三章 压测调优与技术演练——3.1 云上大型赛事压测调优——3.1.3 云上大型赛事系统调优(2): https://developer.aliyun.com/article/1226610?groupCode=supportservice