在 CentOS 中,context 通常指进程的上下文切换(context switches)。监控它通常包含两类:系统级的整体切换频率,以及某个进程或容器的自愿/非自愿切换情况。下面给出可直接执行的命令与判读要点。
一、快速查看系统级上下文切换
- 使用 vmstat 观察整体上下文切换(cs)、运行队列(r)与 CPU 利用率(us、sy):
- 命令:vmstat 1 10
- 关注列:
- cs:每秒上下文切换次数,持续偏高需结合 CPU 利用率与负载判断是否存在调度压力。
- r:运行队列长度,若长期大于 CPU 核心数 表示 CPU 饱和风险。
- us / sy:用户态/内核态占比,配合 cs 判断是否因系统调用或内核态工作导致切换增多。
- 使用 sar 查看历史与实时上下文切换(需安装并启用 sysstat):
- 安装:sudo yum install -y sysstat
- 实时:sar -w 1 10(单位:次/秒)
- 历史:sar -w(查看 /var/log/sa/saXX 中的历史数据)
- 判读:cs 持续高企且 sy 偏高,常见于大量系统调用、I/O 或锁竞争;若 r 同时偏大,多为 CPU 资源不足。
二、按进程查看上下文切换
- 使用 pidstat 精确查看某个进程的自愿/非自愿切换(需 sysstat):
- 安装:sudo yum install -y sysstat
- 命令:pidstat -w -p 1 5
- 关键列:
- cswch/s:自愿上下文切换(资源暂不可用导致阻塞,如 I/O、锁等待)
- nvcswch/s:非自愿上下文切换(时间片到期被强制切换)
- 实践建议:
- 对可疑进程(如 PID=11367)执行:pidstat -w -p 11367 1 5
- 若 nvcswch/s 高,多为 CPU 争用;若 cswch/s 高,多为 I/O 或锁竞争。
三、容器与应用视角的 Context 监控
- 容器(Docker/Podman):
- 进入容器命名空间查看进程切换:nsenter -t <容器PID> -p pidstat -w 1 5
- 或在宿主机按进程聚合:pidstat -w -p $(pidof <容器主进程>) 1 5
- Java/Tomcat 应用:
- 通过 JMX Exporter 暴露线程与请求指标,在 Prometheus + Grafana 中监控线程池、请求耗时与错误率,间接定位由应用争用引发的上下文切换增多(JMX Exporter 配置与抓取示例见下文“进阶与自动化”)。
四、进阶与自动化
- 长期留存与基线对比:启用 sysstat 的历史采集(/etc/sysconfig/sysstat 中设置 ENABLED=“true”),使用 sar 做日/周对比,识别切换突增与周期性峰值。
- 可视化与告警:
- 系统级:部署 Prometheus Node Exporter 采集 vmstat/wait 等指标,Grafana 面板展示 cs、r、us、sy 趋势并设置阈值告警。
- 进程级:将 pidstat 输出接入 Telegraf + InfluxDB/Prometheus,对关键进程的 cswch/s、nvcswch/s 设置动态阈值。
- 快速排障清单:
- cs 高 + sy 高:检查系统调用与内核路径(如大量 I/O、网络、锁)。
- cs 高 + r 高:CPU 资源不足,考虑扩容或优化热点代码/SQL。
- cs 高 + cswch/s 高:I/O 或锁竞争,定位慢查询、锁争用、磁盘/网络瓶颈。
如需,我可以按你的实际环境(物理机/虚拟机/容器、CPU 核数、业务类型)给出对应的监控面板与告警阈值模板。