了解负载平均值与CPU使用率

好的,我自己也是一个Windows用户,所以我对Linux-ytypes的东西的了解有限。

然而,我的一般理解是,“平均负载”是指在任何特定时间,平均在最后一分钟,五分钟和十五分钟内处理了多less处理数据?

无论如何,我一直在监视我的服务器,因为我们有一个很大的开放和很多人!

看到?

我一直在看top ,注意到一些与我以前认识的事情相悖的东西。

如果平均负载为7,并且有4个超线程处理器,那么这不应该意味着CPU正在工作到大约7/8的容量吗?

那么为什么呢显示50.0%的ID? 怎么半天闲着呢?

我没有得到它XD

Solutions Collecting From Web of "了解负载平均值与CPU使用率"

首先, top本身并不计算load average 。 它只是从/proc/loadavg文件中读取load averagestrace显示top打开/proc/loadavg ,然后定期读取它)。 man proc/proc/loadavg

的/ proc / loadavg

该文件中的前三个字段是平均负载数字,给出运行队列(状态R)中的作业数量或者等待磁盘I / O(状态D)的平均时间为1,5和15分钟。 它们与正常运行时间(1)和其他程序给出的平均负载数相同。 第四个字段由两个用斜杠(/)分隔的数字组成。 第一个是当前正在执行的内核调度实体(进程,线程)的数量; 这将会小于或等于CPU的数量。 斜线后的值是系统上当前存在的内核调度实体的数量。 第五个字段是最近在系统上创建的进程的PID。

因此, load average显示运行队列中的作业数量。 你会看到top /proc/loadavg的前三个值。 如果你运行cat /proc/loadavg你会看到文件中的所有值。

顺便说一下,在第四个领域的描述中似乎有错误。 我用C ++编写了一个简单的测试程序,它从输入中读取整数N,然后创建N个线程,每个线程都运行一个不定式循环。 当我运行我的程序,并要求它创建256个线程。 HT只有8个处理器。 但是我在文件中看到:

 >cat /proc/loadavg 74.44 21.04 10.59 259/931 17293 

显然259比我的机器上的CPU数量大。 这篇文章http://juliano.info/en/Blog:Memory_Leak/Understanding_the_Linux_load_average讲的是一样的 – 在load average的描述中有一个错误。 这是一个引用:

值得注意的是,proc(5)手册页目前的解释(截至2009年3月的3.21版手册)是错误的。 它将第四个字段的第一个数字报告为当前正在执行的调度实体的数量,因此预测它不能大于CPU的数量。 这不符合真正的实现,其中此值报告当前可运行线程的数量

所以,回答你的问题:

如果平均负载为7,并且有4个超线程处理器,那么这不应该意味着CPU正在工作到大约7/8的容量吗?

不,这意味着您平均在作业队列中有7个正在运行的进程。

那么为什么呢显示50.0%的ID? 怎么半天闲着呢?

因为load average并不意味着“CPU容量的百分比”。 你的线程只需要使用50%的CPU和50%的时间来做别的事情。

最后。 以下是我的简单测试。 构建使用g++ -pthread my_test.cpp -o my_test 。 运行./my_test 8 ,看看你的空闲时间,当线程不断运行,不花时间等待任何东西。 或运行./my_test 128来查看负载平均值可能比CPU的数量大得多。

 #include <pthread.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <ctype.h> static void* __attribute__ ((noinline)) my_thread_func(void * arg) { printf("Thread %lld:\n", (long long)pthread_self()); volatile long long i = 0; while (1) { ++i; } return 0; } int main(int argc, char *argv[]) { int num_threads; pthread_t *my_threads; num_threads = atoi(argv[1]); my_threads = new pthread_t[num_threads]; for (int tnum = 0; tnum < num_threads; tnum++) { pthread_create(&my_threads[tnum], NULL, &my_thread_func, NULL); } sleep (600); return 0; }