我几乎是第一次来此,因此请随时告诉我我没有遵循正确的程序。下次我会做的更好。
我的主张:如果禁用了处理器,则libgtop函数glibtop_get_cpu()信息会崩溃。
我的环境:我因主板出现硬件问题而禁用了处理器#1(0,1,2,3)。从那时起,大概是结果,gnome-system-monitor现在将机器报告为3 cpus(这是正确的),并将它们称为CPU1,CPU2和CPU3(此处使用的标签并不稀奇,但是我们可以讨论另外一个时间)。更为重要的问题是CPU2和CPU3的CPU值始终为零。当我将gnome-system-monitor的CPU与“ top”(使用“ 1”键获取单个处理器)进行比较时,它们不匹配。当我说不匹配时,“最高”值不为零,而gnome-system-monitor值为零。
“顶部”报告%Cpu0、2和3。没有CPU 1的符号。更重要的是,这些标签的数字值非零。当我使用“压力”命令时,值会按预期移动。 “ top”表示单个处理器处于100%状态,而gnome-system-monitor则为0。
到目前为止的总结:“ top”给出了合理的CPU数字,而gnome-system-monitor则没有。在我的系统上,我禁用了CPU 1(索引为0),并看到CPU2(索引为1)和CPU3(索引为1)具有零CPU。
我一直在阅读和修改gnome-system-monitor中的代码,以探索这些值的来源,并且我确定gnome-system-monitor程序本身没有什么“错误”。至少就CPU的数值而言。这是因为gnome-system-monitor使用的数据来自libgtop库,尤其是glibtop_get_cpu()函数。对于所有等于1的索引(0索引–在C ++代码中),glibtop_get_cpu()返回的结果数据为零。
在我看来,我需要了解glibtop_get_cpu()的工作原理,但是我没有运气找到glibtop_get_cpu()的源代码。接下来我该怎么办?我正在使用的库是Ubuntu 18.04.1。上的2.38.0-2ubuntu0.18.04.1…。很高兴尝试任何建议。我可能不知道该怎么做,但我可以学习。
我应该提出一个错误吗?如果可能的话,我想在第一遍做得更多。我希望能够研究问题并提出解决方案,但此刻,我陷入了困境。
编辑! (建议对原始问题进行改进)
输出错误:
# echo 1 > /sys/devices/system/cpu/cpu1/online // bring all cpu online for the base case
$ ./test_get_cpu
glibtop_sysinfo()->ncpu is 4
xcpu_total[0] is 485898
xcpu_total[1] is 1532
xcpu_total[2] is 484263
xcpu_total[3] is 487052
$
# echo 0 > /sys/devices/system/cpu/cpu1/online // take cpu1 offline again
$ ./test_get_cpu
glibtop_sysinfo()->ncpu is 3 // ncpu is correct
xcpu_total[0] is 501416
$
# echo 1 > /sys/devices/system/cpu/cpu1/online // bring cpu1 online
# echo 0 > /sys/devices/system/cpu/cpu2/online // … and take cpu2 offline
$ ./test_get_cpu
glibtop_sysinfo()->ncpu is 3
xcpu_total[0] is 508264
xcpu_total[1] is 5416
$
解释:如预期的那样,使'cpu2'脱机意味着在glibtop_get_cpu()结果中看不到'cpu3'。通过归纳,(风险)我认为我们使“ cpu”脱机,对于所有“ cpu”及更高版本,我们将不会获得任何统计信息。
这是我证明glibtop_get_cpu()有问题的证据。
我的代码:
#include <iostream>
using namespace std;
#include <glibtop/cpu.h>
#include <glibtop/sysinfo.h>
main() {
const glibtop_sysinfo * sysinfo = glibtop_get_sysinfo();
glibtop_cpu cpu;
glibtop_get_cpu(&cpu);
cout << "glibtop_sysinfo()->ncpu is " << sysinfo->ncpu << endl;
//for (int i=0;i<sysinfo->ncpu;++i) { // e.g. ncpu might be 3 if one processor disabled on a quad core
for (int i=0;i<GLIBTOP_NCPU;++i) { // Alternatively, look through 1024 slots
if (cpu.xcpu_total[i] != 0) {
cout << "xcpu_total[" << i << "] is " << cpu.xcpu_total[i] << endl;
}
}
}
最佳答案
我找到了我正在寻找的代码@ https://github.com/GNOME/libgtop
很抱歉浪费了任何人的时间。我不知道上面的代码是如何工作的。例如,我不知道如何/ if /在哪里定义glibtop_get_cpu_l(),但我可以在代码中看到足够多的地方来认识到,如代码所示,它看起来在/ proc / stat中,并且是否找不到特定的“ cpu”那么这是一个“警告”,并记录在某处(现在不在此位置),其余的cpu被跳过。我将在自己的时间里做更多的工作。
关于linux - 如果禁用了处理器,则ibgtop函数glibtop_get_cpu()信息会中断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53533352/