监控服务器
📌 指标分析
🚁 CPU/系统平均负载
系统平均负载,CPU在一段时间内的使用量。
一般来说,系统平均负载超过CPU核数
数倍时,视为异常。
🔧 top-实时监控系统性能
- top -u user # -u指定用户启动的进程
- top -H -p pid # -u -p不能一起用,-H启用线程模式,显示进程中各线程的详细信息。
交互按键:
- 数字键1,切换显示每个CPU核心的使用情况。
- P,按CPU使用率排序
- M,按内存使用量排序
- u -> 输入用户名 -> 回车,查看某个用户的进程
- k -> 输入pid,杀进程
- R,反转当前排序。
- Z,切换颜色模式。
每个CPU核心使用情况:
- us - user 用户使用量
- sy - system 系统使用量
- id - idle 空闲使用量
- wa - wait io等待使用量
load average - 平均负载,有3个数值,分别代表1、5、15分钟内的平均负载。
若数值递减,说明系统压力逐渐增大。若值大于等于CPU核数
,说明超负荷。
🔧 pidstat -d
除了看cpu使用量,还需要看等待(非IO等待);当超负荷运行时,等待/阻塞的进程就明显较多。
pidstat
看用户进程的CPU占用,其中%wait
代表进程等待,包括IO等待、锁竞争等待、资源等待、同步等待。
若怀疑是IO等待,需结合iostat
等工具进一步确认。
场景分析:
- 当CPU使用率高,平均负载低((使用+等待)/核数),说明当前进程正在使用占多数,等待的少,此时找cpu占用高的进程进行分析(如java应用、db、redis等)。
- 当CPU使用率低,平均负载高,说明当前进程正在等待占多数。等待需要区分计算密集型、IO密集型。
- 当两者都高,说明使用、等待的进程都多,也是找cpu占用高的进程进行分析。
🚁 内存
free -h
查看内存使用情况
🔧 swap
交互区,当机器内存不足时会使用,且性能会下降。一般都禁用swap区。
vmstat 1 5
si - swap in,从swap区读到内存
so - swap out,从内存写到swap区
🚁 网络
宽带: 如100兆,即100mbps或100m bit/s
带宽: 上述宽带换算为带宽,即100Mbps / 8 = 12.5MB/s
常用命令包括:
lsof -n
或者netstat -tpln
,查端口占用。telnet ip port
或者ping
,测试网络能否调通。ifconfig
-查内网ip;curl cip.cc-查公网ip。iperf
,测试最大TCP、UDP带宽性能;需要服务端(iperf -s)和客户端(iperf -c ip -t 20)。tcping -t 10 ip 80
,看目标机器端口是否开放。
🔧 性能测试如何考虑网络
- 公司内网/局域网
- 服务器不在公司内部,在客户机器或者其他公司的局域网;通过跳板机/堡垒机压测
- 项目部署在云服务器;在云服务器申请测试机,保证在同个局域网下
📌 加压工具
# 前俩是否必须待确认
#sudo yum install -y epel-release
#sudo yun install -y sysstat
# 使用yum能自动安装依赖
sudo yum install -y stress
# 模拟8个进程加压
stress -c 8 --timeout 600
# 模拟IO压力,单个进程不断执行sync(内存映射到磁盘)
stress -i 1 --timeout 600
📌 面试题
🚁 如果性能测试需要在云环境中执行,您会如何设计测试以适应云服务的弹性和可扩展性?
- 在云服务器申请测试机,保证在同个局域网下。
- 使用JMeter主从模式进行压测,监控常规的性能指标(如TPS、响应时间、错误率等)。
- 观察系统是否会自动扩容: 设计阶梯式加压,在压力上升时,是否触发了自动扩容策略,扩容的速度是否满足需求。
- 观察容器负载是否均衡: 使用监控面板查看各节点的QPS、CPU、内存使用情况,是否出现资源倾斜。
- 压力释放后系统的恢复能力: 压力结束后,系统是否能够自动缩容,系统资源是否及时释放,缩容时是否出现请求异常。
- 业务逻辑验证: 脚本添加断言,检查自动扩缩容时,数据一致性是否得到保障。
🚁 CPU占用高,其他资源(内存、IO)不高,原因及分析
CPU高但其他资源无瓶颈,说明系统瓶颈在“计算密集型任务”,常见原因包括:
- 无限循环/递归
- 复杂计算:大量数学运算(如加密/解密、哈希计算)、大数据量循环处理(如遍历百万级集合)。
- 频繁GC
- 线程竞争:多线程争夺锁,导致上下文切换频繁。
- 第三方库/框架问题:某些第三方组件(如日志框架、序列化工具)的低效实现(如频繁字符串拼接)。
分析步骤
top -p <pid>
聚焦指定进程,找CPU占用高的进程。top -H -p <pid>
显示进程内线程,找到CPU占用高的线程。- 使用Arthas的trace命令,定位到具体方法。
- 验证GC情况:
jstat -gc <pid> 1000
每1秒输出GC统计;FGC
-Full GC次数、FGCT
-Full GC时间,计算是否频繁(如每分钟多次FGC)。
🚁 CPU 200%,是否存在问题?
当双核CPU负载200%,意味着两个核心满负荷运行,若应用是多线程/并行计算(如Java线程池处理大量请求),且TPS稳定、响应时间正常,则是合理的(充分利用多核资源)。
但TPS未随着CPU负载而增加,且响应时间异常长,则存在问题:
-
线程竞争剧烈,大量线程争夺同一锁,导致上下文切换频繁
vmstat 1
看上下文切换次数(cs指标):若cs远高于正常水平(如>10000次/秒),说明线程竞争剧烈。 -
频繁GC占用CPU
jstat -gc <pid> 1000
每1秒输出GC统计
FGC
-Full GC次数、FGCT
-Full GC时间,计算是否频繁(如每分钟多次FGC)