Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
mator opened this issue Aug 21, 2021 · 6 comments · May be fixed by #1342
Open

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

mator opened this issue Aug 21, 2021 · 6 comments · May be fixed by #1342
Labels
bug 🐛 Something isn't working
Milestone

Comments

@mator
Copy link

mator commented Aug 21, 2021

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
@cgzones cgzones added the bug 🐛 Something isn't working label Aug 21, 2021
@cgzones cgzones added this to the 3.1.0 milestone Aug 21, 2021
cgzones added a commit to cgzones/htop that referenced this issue Aug 21, 2021
cgzones added a commit to cgzones/htop that referenced this issue Aug 21, 2021
@BenBE BenBE modified the milestones: 3.1.0, 3.1.1 Aug 22, 2021
@cgzones
Copy link
Member

cgzones commented Aug 22, 2021

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 added a commit to cgzones/htop that referenced this issue Aug 22, 2021
@mator
Copy link
Author

mator commented Aug 22, 2021

$ 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.

@zv-io
Copy link

zv-io commented Jun 28, 2023

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.

@glaubitz
Copy link

glaubitz commented Nov 12, 2023

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
Copy link

glaubitz commented Dec 3, 2023

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 added a commit to glaubitz/htop that referenced this issue Dec 3, 2023
glaubitz added a commit to glaubitz/htop that referenced this issue Dec 3, 2023
Instead of enumerating the number of active and existing CPUs on Linux
by iterating over the pseudo-files below /sys/devices/system/cpu/, it
is better to retrieve the number of active and existing CPUs using the
sysconf() function using _SC_NPROCESSORS_ONLN and _SC_NPROCESSORS_CONF
which will always report the correct numbers.

Fixes htop-dev#757
@BenBE BenBE modified the milestones: 3.3.0, 3.4.0 Dec 26, 2023
@C0rn3j
Copy link
Contributor

C0rn3j commented Jan 31, 2024

#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 #1198 after a merge.

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug 🐛 Something isn't working
Projects
None yet
7 participants