我原本以为 CPU 平均负载是根据处于运行状态 (R 状态) 的进程数 + 等待 I/O 的进程数 (D 状态) 来计算的。但是今天我注意到服务器显示的平均负载很高,正在运行的进程数为 1,并且没有等待 I/O 的进程。
我还检查了正在运行的线程数和最小 I/O 进程数。有人能告诉我这个较高的平均负载数字是从哪里产生的吗?
系统有 4 核 CPU 和 Ubuntu 操作系统。
top - 21:10:01 up 4 days, 23:29, 0 users, load average: 32.31, 43.25, 19.64
Threads: 2077 total, 1 running, 2076 sleeping, 0 stopped, 0 zombie
%Cpu(s): 4.9 us, 2.0 sy, 0.1 ni, 92.0 id, 0.6 wa, 0.4 hi, 0.0 si, 0.0 st
KiB Mem: 16434332 total, 15447756 used, 986576 free, 1593972 buffers
KiB 交换:总计 6287356,已使用 1259140,可用 5028216。2754608 缓存内存
所以我在这里寻找计算系统平均负载的精确公式。提前致谢。
答案1
负载是当前暂停等待系统调用的线程数。
尝试运行
ps -eafT
您可能会发现您的单个进程可以有数十个线程。
系统负载基本上是当时调度承诺的衡量标准。您有多个核心可供调度。如果有那么多 pid 或线程完全占满调度程序,您将看到核心负载。
您的平均负载很容易飙升到比这高得多的水平。一旦达到饱和状态,您就无法执行可能添加的那么多“工作”,并且可能会出现“堆积如山”的任务。系统必须先处理其积压的系统调用,然后负载才能再次下降。
答案2
首先,问题是什么,是否存在用户响应时间问题?
平均负载为 30 或 40 意味着有多个进程正在运行或有多个 I/O 等待。
你的分析不够充分。首先60,000 毫秒内的 Linux 性能分析
简洁版本:
uptime
dmesg | tail
vmstat 1
mpstat -P ALL 1
pidstat 1
iostat -xz 1
free -m
sar -n DEV 1
sar -n TCP,ETCP 1
top