是否有指标可以显示某个流程何时“走向黑暗面”?
我觉得仅使用 MEM% 和 CPU% 不足以检测诸如内存泄漏(或其他问题,请原谅我的词汇量有限)之类的问题,因为如果对程序没有足够的了解,很难知道该程序“应该”使用多少内存或 CPU。
那么我怎样才能找出真正糟糕的流程和仅仅是昂贵的流程呢?
答案1
我认为很难确切地知道一个程序“应该”使用多少资源,但有一些指标可以检查你的系统是否有足够的资源来处理该程序。
首先,我们通过以下方式检查进程的 PID(例如进程名称为 dataserver):
ps aux | grep dataserver
sybxxx 795 52.9 0.0 1190088 22548 ? S<sl Jun06 38192:51 /sybase/XXX/ASE-16_0/bin/dataserver
这里我们知道进程 ID 是 795,所以我们利用PID统计命令:
pidstat -h -r -u -p 795 5
Time PID %usr %system %guest %CPU CPU minflt/s majflt/s VSZ RSS %MEM Command
1469520679 795 242.80 5.00 0.00 247.80 24 0.00 0.00 53618888 22548 0.02 dataserver
从输出中,我们知道该进程使用了大约 2.4 个 CPU 核心,而系统安装了 24 个核心。此外,所用内存的百分比约为安装内存总量的 0.02%。
除了这些信息之外,我认为进行一次常规系统检查以防止资源短缺就足够了。
首先,检查CPU 负载,您可以使用特区命令。要确定系统的性能是否不佳,您可以检查以下输出。
正常情况下iostat的输出类似如下:
sar
12:00:01 AM CPU %user %nice %system %iowait %steal %idle
12:10:01 AM all 0.70 0.00 0.15 0.01 0.00 99.13
对于非繁忙系统,%idle 的值应该保持较高,而 %user、%system 和 %iowait 的值应该较低。
为了磁盘输入/输出问题,你可以检查结果iostat -x:
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.07 1.58 0.27 1.04 13.72 20.87 26.54 0.01 7.50 3.33 0.43
sdc 4.09 252.47 483.10 5.90 18616.61 2148.57 42.46 5.88 12.03 1.99 97.29
这是一个糟糕的例子,正如您所看到的,设备 sdc 的利用率百分比已变成 97.29%,这表明存在磁盘 I/O 问题。
要检查系统是否有足够的内存,请查看分页使用情况:
sar -B
10:30:01 AM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
10:40:01 AM 8524.25 47.12 856.03 0.00 263.76 0.00 0.00 0.00 0.00
10:50:01 AM 8391.64 82.94 1116.50 0.08 377.87 0.00 0.00 0.00 0.00
我们可以看到,该服务器每秒的页面调入量非常高,因此我们怀疑系统内存不足。
答案2
我通常首先查看负载。如果 3 个数字中有 2 个高于 3,则说明您走错了方向。如果 3 个数字中的任何一个负载超过 8,则说明存在严重问题,这意味着您正在运行一个进程的多个分支,或者您的机器无法处理您要执行的操作。示例:运行一个 Torque 批处理服务器,其中有大量作业,但核心太少。
然后如果您的某个进程使用了越来越多的 CPU,这也表明存在内存泄漏问题,或者也可能是您正在使用名为 Chrome/Firefox 的组件 :) 实际上,Firefox 因使用附加插件(如 Skype)而遭受严重损失,这导致旧版本出现溢出。
另一个指标是存在大量相同类型的跨进程,但并不总是个问题。
问题的早期指标之一是标记为 [defunct] 的进程,因为它当时已经失去功能,就像我认识的大多数人一样!