htop icon indicating copy to clipboard operation
htop copied to clipboard

[sparc64] limit cpu shown on active (online) cpus only?

Open mator opened this issue 2 years ago • 6 comments

Hello!

After PR #656 htop shows all available CPUs , instead of active ones. How do i limit it to show it to only active CPUs?

For example, on sparc64 linux platform, under LDOM (read virtual machine), there's only particular list of CPUs available for LDOM. I.e. my LDOM has 8 active CPUs (allocated for VM from hypervisor):

$ nproc  --all
256
$ nproc
8
$ lscpu
Architecture:        sparc64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Big Endian
CPU(s):              8
On-line CPU(s) list: 0-7
Thread(s) per core:  8
Core(s) per socket:  1
Socket(s):           1
Model name:          UltraSparc T5 (Niagara5)
Flags:               sun4v

and there's no point to show unavailable (256-8 == 248) CPUs (which would 0 load anyway).

This is how htop (3.0.5) was looking before:


    0[                                       0.0%]     4[                                       0.0%]
    1[|||                                    3.8%]     5[|                                      0.6%]
    2[                                       0.0%]     6[||                                     1.3%]
    3[                                       0.0%]     7[|                                      0.6%]
  Mem[||||||||                         641M/15.7G]   Tasks: 29, 6 thr; 1 running
  Swp[                                    0K/769M]   Load average: 0.02 0.01 0.00
                                                     Uptime: 1 day, 09:05:00
                                                     Date & Time: 2021-08-21 22:43:56

    PID USER      PRI  NI  VIRT   RES   SHR S CPU%▽MEM%   TIME+  Command
  77472 mator      25   5 29816  4896  3640 R  3.2  0.0  0:00.25 htop
      1 root       20   0  185M 10336  7256 S  0.0  0.1  0:12.01 /sbin/init
    282 root       20   0  164M 75944 74616 S  0.0  0.5  0:07.75 /lib/systemd/systemd-journald

and this is how it (3.1.0-dev) looks now:

    0[                                                                                0.0%]   128[                                                                                0.0%]
    1[||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||100.0%]   129[                                                                                0.0%]
    2[                                                                                0.0%]   130[                                                                                0.0%]
    3[                                                                                0.0%]   131[                                                                                0.0%]
    4[                                                                                0.0%]   132[                                                                                0.0%]
    5[                                                                                0.0%]   133[                                                                                0.0%]
    6[                                                                                0.0%]   134[                                                                                0.0%]
    7[                                                                                0.0%]   135[                                                                                0.0%]
    8[                                                                                0.0%]   136[                                                                                0.0%]
    9[                                                                                0.0%]   137[                                                                                0.0%]
   10[                                                                                0.0%]   138[                                                                                0.0%]
   11[                                                                                0.0%]   139[                                                                                0.0%]
   12[                                                                                0.0%]   140[                                                                                0.0%]
   13[                                                                                0.0%]   141[                                                                                0.0%]
   14[                                                                                0.0%]   142[                                                                                0.0%]
   15[                                                                                0.0%]   143[                                                                                0.0%]
   16[                                                                                0.0%]   144[                                                                                0.0%]
   17[                                                                                0.0%]   145[                                                                                0.0%]
   18[                                                                                0.0%]   146[                                                                                0.0%]
   19[                                                                                0.0%]   147[                                                                                0.0%]
   20[                                                                                0.0%]   148[                                                                                0.0%]
   21[                                                                                0.0%]   149[                                                                                0.0%]
   22[                                                                                0.0%]   150[                                                                                0.0%]
   23[                                                                                0.0%]   151[                                                                                0.0%]
   24[                                                                                0.0%]   152[                                                                                0.0%]
   25[                                                                                0.0%]   153[                                                                                0.0%]
   26[                                                                                0.0%]   154[                                                                                0.0%]
   27[                                                                                0.0%]   155[                                                                                0.0%]
   28[                                                                                0.0%]   156[                                                                                0.0%]
   29[                                                                                0.0%]   157[                                                                                0.0%]
   30[                                                                                0.0%]   158[                                                                                0.0%]
   31[                                                                                0.0%]   159[                                                                                0.0%]
   32[                                                                                0.0%]   160[                                                                                0.0%]
   33[                                                                                0.0%]   161[                                                                                0.0%]
   34[                                                                                0.0%]   162[                                                                                0.0%]
   35[                                                                                0.0%]   163[                                                                                0.0%]
   36[                                                                                0.0%]   164[                                                                                0.0%]
   37[                                                                                0.0%]   165[                                                                                0.0%]
   38[                                                                                0.0%]   166[                                                                                0.0%]
   39[                                                                                0.0%]   167[                                                                                0.0%]
   40[                                                                                0.0%]   168[                                                                                0.0%]
   41[                                                                                0.0%]   169[                                                                                0.0%]
   42[                                                                                0.0%]   170[                                                                                0.0%]
   43[                                                                                0.0%]   171[                                                                                0.0%]
   44[                                                                                0.0%]   172[                                                                                0.0%]
   45[                                                                                0.0%]   173[                                                                                0.0%]
   46[                                                                                0.0%]   174[                                                                                0.0%]
   47[                                                                                0.0%]   175[                                                                                0.0%]
   48[                                                                                0.0%]   176[                                                                                0.0%]
   49[                                                                                0.0%]   177[                                                                                0.0%]
   50[                                                                                0.0%]   178[                                                                                0.0%]
   51[                                                                                0.0%]   179[                                                                                0.0%]
   52[                                                                                0.0%]   180[                                                                                0.0%]
   53[                                                                                0.0%]   181[                                                                                0.0%]
   54[                                                                                0.0%]   182[                                                                                0.0%]
   55[                                                                                0.0%]   183[                                                                                0.0%]
   56[                                                                                0.0%]   184[                                                                                0.0%]
   57[                                                                                0.0%]   185[                                                                                0.0%]
   58[                                                                                0.0%]   186[                                                                                0.0%]
   59[                                                                                0.0%]   187[                                                                                0.0%]
   60[                                                                                0.0%]   188[                                                                                0.0%]
   61[                                                                                0.0%]   189[                                                                                0.0%]
   62[                                                                                0.0%]   190[                                                                                0.0%]
   63[                                                                                0.0%]   191[                                                                                0.0%]
   64[                                                                                0.0%]   192[                                                                                0.0%]
   65[                                                                                0.0%]   193[                                                                                0.0%]
   66[                                                                                0.0%]   194[                                                                                0.0%]
   67[                                                                                0.0%]   195[                                                                                0.0%]
   68[                                                                                0.0%]   196[                                                                                0.0%]
   69[                                                                                0.0%]   197[                                                                                0.0%]
   70[                                                                                0.0%]   198[                                                                                0.0%]
   71[                                                                                0.0%]   199[                                                                                0.0%]
   72[                                                                                0.0%]   200[                                                                                0.0%]
   73[                                                                                0.0%]   201[                                                                                0.0%]
   74[                                                                                0.0%]   202[                                                                                0.0%]
   75[                                                                                0.0%]   203[                                                                                0.0%]
   76[                                                                                0.0%]   204[                                                                                0.0%]
   77[                                                                                0.0%]   205[                                                                                0.0%]
   78[                                                                                0.0%]   206[                                                                                0.0%]
   79[                                                                                0.0%]   207[                                                                                0.0%]
   80[                                                                                0.0%]   208[                                                                                0.0%]
   81[                                                                                0.0%]   209[                                                                                0.0%]
   82[                                                                                0.0%]   210[                                                                                0.0%]
   83[                                                                                0.0%]   211[                                                                                0.0%]
   84[                                                                                0.0%]   212[                                                                                0.0%]
   85[                                                                                0.0%]   213[                                                                                0.0%]
   86[                                                                                0.0%]   214[                                                                                0.0%]
   87[                                                                                0.0%]   215[                                                                                0.0%]
   88[                                                                                0.0%]   216[                                                                                0.0%]
   89[                                                                                0.0%]   217[                                                                                0.0%]
   90[                                                                                0.0%]   218[                                                                                0.0%]
   91[                                                                                0.0%]   219[                                                                                0.0%]
   92[                                                                                0.0%]   220[                                                                                0.0%]
   93[                                                                                0.0%]   221[                                                                                0.0%]
   94[                                                                                0.0%]   222[                                                                                0.0%]
   95[                                                                                0.0%]   223[                                                                                0.0%]
   96[                                                                                0.0%]   224[                                                                                0.0%]
   97[                                                                                0.0%]   225[                                                                                0.0%]
   98[                                                                                0.0%]   226[                                                                                0.0%]
   99[                                                                                0.0%]   227[                                                                                0.0%]
  100[                                                                                0.0%]   228[                                                                                0.0%]
  101[                                                                                0.0%]   229[                                                                                0.0%]
  102[                                                                                0.0%]   230[                                                                                0.0%]
  103[                                                                                0.0%]   231[                                                                                0.0%]
  104[                                                                                0.0%]   232[                                                                                0.0%]
  105[                                                                                0.0%]   233[                                                                                0.0%]
  106[                                                                                0.0%]   234[                                                                                0.0%]
  107[                                                                                0.0%]   235[                                                                                0.0%]
  108[                                                                                0.0%]   236[                                                                                0.0%]
  109[                                                                                0.0%]   237[                                                                                0.0%]
  110[                                                                                0.0%]   238[                                                                                0.0%]
  111[                                                                                0.0%]   239[                                                                                0.0%]
  112[                                                                                0.0%]   240[                                                                                0.0%]
  113[                                                                                0.0%]   241[                                                                                0.0%]
  114[                                                                                0.0%]   242[                                                                                0.0%]
  115[                                                                                0.0%]   243[                                                                                0.0%]
  116[                                                                                0.0%]   244[                                                                                0.0%]
  117[                                                                                0.0%]   245[                                                                                0.0%]
  118[                                                                                0.0%]   246[                                                                                0.0%]
  119[                                                                                0.0%]   247[                                                                                0.0%]
  120[                                                                                0.0%]   248[                                                                                0.0%]
  121[                                                                                0.0%]   249[                                                                                0.0%]
  122[                                                                                0.0%]   250[                                                                                0.0%]
  123[                                                                                0.0%]   251[                                                                                0.0%]
  124[                                                                                0.0%]   252[                                                                                0.0%]
  125[                                                                                0.0%]   253[                                                                                0.0%]
  126[                                                                                0.0%]   254[                                                                                0.0%]
  127[                                                                                0.0%]   255[                                                                                0.0%]
  Mem[|||||||||||||||                                                           995M/15.7G]   Tasks: 29, 6 thr, 107 kthr; 2 running
  Swp[                                                                             0K/769M]   Load average: 0.09 0.02 0.01
                                                                                              Uptime: 1 day, 09:08:50

    PID USER      PRI  NI  VIRT   RES   SHR S CPU%▽MEM%   TIME+  Command
  77491 mator      25   5 29448  6728  3600 R 3357  0.0  0:00.40 ./htop
      1 root       20   0  185M 10336  7256 S  0.0  0.1  0:12.01 /sbin/init
    282 root       20   0  164M 75968 74640 S  0.0  0.5  0:07.75 /lib/systemd/systemd-journald
    317 root       20   0 42664  5840  4312 S  0.0  0.0  0:01.07 /lib/systemd/systemd-udevd

mator avatar Aug 21 '21 19:08 mator

Can you please post the output of /proc/stat and the contents of /sys/devices/system/cpu/cpu127/ and /sys/devices/system/cpu/cpu127/online (or of any other non active CPU). Htop seems not to recognize the non-online CPUs as inactive.

cgzones avatar Aug 22 '21 14:08 cgzones

$ cat /proc/stat
cpu  8477 139861 113330 167608263 31848 0 1718 0 0 0
cpu0 1068 17044 24846 20950687 3501 0 20 0 0 0
cpu1 1213 19162 13566 20948701 7502 0 66 0 0 0
cpu2 858 19855 14322 20957078 1418 0 48 0 0 0
cpu3 1665 15851 12110 20920013 5878 0 1518 0 0 0
cpu4 724 17790 12005 20959885 1670 0 24 0 0 0
cpu5 1245 16615 12460 20951945 5334 0 15 0 0 0
cpu6 878 16927 13908 20956061 5453 0 14 0 0 0
cpu7 824 16613 10111 20963888 1090 0 10 0 0 0
intr 9021833 7516062 0 0 16 0 23485 0 399 0 29955 0 1115899 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 8715516
btime 1629455936
processes 82050
procs_running 1
procs_blocked 0
softirq 11961941 0 2149071 164053 1115908 224 0 2 3406064 258 5126361
$ ls /sys/devices/system/cpu/cpu127/
hotplug  subsystem  uevent
$ ls /sys/devices/system/cpu/cpu0/
clock_tick  hotplug  l1_dcache_line_size  l1_dcache_size  l1_icache_line_size  l1_icache_size  l2_cache_line_size  l2_cache_size  subsystem  topology  uevent
$ cat /sys/devices/system/cpu/online
0-7
$ cat /sys/devices/system/cpu/possible
0-255
$ cat /sys/devices/system/cpu/present
0-7
$ cat /sys/devices/system/cpu/offline
8-255

PS: there's util-linux dump from a physical machine (not a VM) with all cpus online, which is not exactly my case, but could be probably useful.

mator avatar Aug 22 '21 21:08 mator

An additional data point: the CPU% field is off by a factor of the ratio of online-vs-offline CPUs:

image

In this example, 32 threads of a possible 128 are allocated to the Linux LDOM, and the CPU% column is incorrectly scaled by a factor of 4.

zv-io avatar Jun 28 '23 14:06 zv-io

There is a very obvious bug here which is determining the amount of active CPUs on Linux using a custom implementation equivalent to sysconf(_SC_NPROCESSORS_CONF) which returns the number of all CPUs in a system while sysconf(_SC_NPROCESSORS_ONLN) will actually return the number of online CPUs which is what we want here.

The corresponding Solaris code actually does it correctly [1]:

   s = sysconf(_SC_NPROCESSORS_ONLN);
   if (s < 1)
      CRT_fatalError("Cannot get active CPU count by sysconf(_SC_NPROCESSORS_ONLN)");

   if (s != super->activeCPUs) {
      change = true;
      hsuper->activeCPUs = s;
   }

while the corresponding Linux code reads out /sys/devices/system/cpu [2] and tries to determine the number of active CPUs with its own algorithm which fails.

The obvious solution would be to determine the number of active CPUs using sysconf(_SC_NPROCESSORS_ONLN), i.e. simply imitating what the Solaris code already does.

[1] https://github.com/htop-dev/htop/blob/main/solaris/SolarisMachine.c#L53

[2] https://github.com/htop-dev/htop/blob/main/linux/LinuxMachine.c#L43

glaubitz avatar Nov 12 '23 18:11 glaubitz

This would be my suggested fix:

From af53a75a5c23b1d4aec4aceadbc329997e306f15 Mon Sep 17 00:00:00 2001
From: John Paul Adrian Glaubitz <[email protected]>
Date: Sun, 3 Dec 2023 19:01:00 +0100
Subject: [PATCH] Use sysconf() to determine active and existing CPUs on Linux

---
 linux/LinuxMachine.c | 64 +++++++-------------------------------------
 1 file changed, 10 insertions(+), 54 deletions(-)

diff --git a/linux/LinuxMachine.c b/linux/LinuxMachine.c
index aa1ff5f8..b71502ef 100644
--- a/linux/LinuxMachine.c
+++ b/linux/LinuxMachine.c
@@ -40,9 +40,6 @@ in the source distribution for its full text.
 #define O_PATH         010000000 // declare for ancient glibc versions
 #endif
 
-/* Similar to get_nprocs_conf(3) / _SC_NPROCESSORS_CONF
- * https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/getsysstats.c;hb=HEAD
- */
 static void LinuxMachine_updateCPUcount(LinuxMachine* this) {
    unsigned int existing = 0, active = 0;
    Machine* super = &this->super;
@@ -56,63 +53,22 @@ static void LinuxMachine_updateCPUcount(LinuxMachine* this) {
       super->existingCPUs = 1;
    }
 
-   DIR* dir = opendir("/sys/devices/system/cpu");
-   if (!dir)
-      return;
-
    unsigned int currExisting = super->existingCPUs;
 
-   const struct dirent* entry;
-   while ((entry = readdir(dir)) != NULL) {
-      if (entry->d_type != DT_DIR && entry->d_type != DT_UNKNOWN)
-         continue;
-
-      if (!String_startsWith(entry->d_name, "cpu"))
-         continue;
+   existing = sysconf(_SC_NPROCESSORS_CONF);
+   active = sysconf(_SC_NPROCESSORS_ONLN);
 
-      char* endp;
-      unsigned long int id = strtoul(entry->d_name + 3, &endp, 10);
-      if (id == ULONG_MAX || endp == entry->d_name + 3 || *endp != '\0')
-         continue;
+   this->cpuData = xReallocArrayZero(this->cpuData, currExisting ? (currExisting + 1) : 0, existing + 1, sizeof(CPUData));
+   this->cpuData[0].online = true; /* average is always "online" */
+   currExisting = existing;
 
-#ifdef HAVE_OPENAT
-      int cpuDirFd = openat(dirfd(dir), entry->d_name, O_DIRECTORY | O_PATH | O_NOFOLLOW);
-      if (cpuDirFd < 0)
-         continue;
-#else
-      char cpuDirFd[4096];
-      xSnprintf(cpuDirFd, sizeof(cpuDirFd), "/sys/devices/system/cpu/%s", entry->d_name);
-#endif
-
-      existing++;
-
-      /* readdir() iterates with no specific order */
-      unsigned int max = MAXIMUM(existing, id + 1);
-      if (max > currExisting) {
-         this->cpuData = xReallocArrayZero(this->cpuData, currExisting ? (currExisting + 1) : 0, max + /* aggregate */ 1, sizeof(CPUData));
-         this->cpuData[0].online = true; /* average is always "online" */
-         currExisting = max;
-      }
-
-      char buffer[8];
-      ssize_t res = xReadfileat(cpuDirFd, "online", buffer, sizeof(buffer));
-      /* If the file "online" does not exist or on failure count as active */
-      if (res < 1 || buffer[0] != '0') {
-         active++;
-         this->cpuData[id + 1].online = true;
-      } else {
-         this->cpuData[id + 1].online = false;
-      }
-
-      Compat_openatArgClose(cpuDirFd);
+   for (unsigned int i = 0; i < existing; i++) {
+     if (i <= active)
+       this->cpuData[i].online = true;
+     else
+       this->cpuData[i].online = false;
    }
 
-   closedir(dir);
-
-   // return if no CPU is found
-   if (existing < 1)
-      return;
-
 #ifdef HAVE_SENSORS_SENSORS_H
    /* When started with offline CPUs, libsensors does not monitor those,
     * even when they become online. */
-- 
2.43.0

However, htop should still gain an option to hide offline CPUs which it currently does not have.

glaubitz avatar Dec 03 '23 18:12 glaubitz

https://github.com/htop-dev/htop/pull/1394 should fix the trailing offline threads not showing up as offline since 3.1.0

The threads in both people's screenshots are not marked as offline.

@mator @zv-io if you can test that #1394 marks the offline CPUs as such, this should be closed in favor of https://github.com/htop-dev/htop/issues/1198 after a merge.

EDIT: Sorry for the double post, my intention was to edit the now-deleted comment.

C0rn3j avatar Jan 31 '24 10:01 C0rn3j