terça-feira, 20 de outubro de 2020

Conky altera duas vezes o cálculo da Memória usada

Aumento aparente de uso de RAM, após o Conky 1.11.6

• Desde Agosto 2020, o Conky 1.11.6 passou a mostrar valores muito mais altos de uso de Memória RAM — no openSUSE Tumbleweed, Debian testing, Fedora, Mageia 8 (beta), Void Linux.

Situação após nova reviravolta do Conky

• Em Março 2021, o Conky 1.12.1 fez outra reviravolta, — passando a exibir valores muito baixos.

Desse modo, passaram a coexistir versões do Conky com 3 diferentes cálculos de uso de Memória RAM:

Conky 1.10.8   =  htop   (htop)        Neon, Mint, MX Linux
Conky 1.11.6   >  htop   (new calc)    Arch, Debian testing, Mageia 8
Conky 1.12.1   <  htop   (free, top)   openSUSE Tumbleweed, Fedora 33, PCLinuxOS, Void

Outras ferramentas estão passandopor mudanças semelhantes — enquanto algumas ainda se mantêm inalteradas:

  • O inxi, o neofetch e o screenfetch agora apresentam versões com cálculos diferentes, também.
  • htop e o free / top (procps) são as ferramentas que ainda permitem comparar o uso inicial de Memória RAM entre as 12 distros instaladas no meu PC, porque cada uma continua usando um mesmo cálculo em todas as suas versões.


Índice


  • Novo cálculo (Conky 1.11.6)
  • Comparação precária (I)
  • Reviravolta (Conky 1.12.1)
  • Comparação precária (II)
  • Perspectivas
  • Ferramentas e medições

Novo cálculo (Conky 1.11.6)


Proposta do novo cálculo, em 2014

Os altos valores de uso de Memória RAM no Conky 1.11.6, não são um bug. — Trata-se de uma “correção” do antigo cálculo da “Memória RAM usada”, sugerida ou subscrita por Linus Torvalds desde 2014 (Kernel 3.14), quando se introduziu em /proc/meminfo um campo “MemAvailable”, exatamente para tornar esse cálculo mais acurado:

Currently, the amount of memory that is available for a new workload, without pushing the system into swap, can be estimated from MemFree, Active(file), Inactive(file), and SReclaimable, as well as the "low" watermarks from /proc/zoneinfo.

However, this may change in the future, and user space really should not be expected to know kernel internals to come up with an estimate for the amount of free memory.

It is more convenient to provide such an estimate in /proc/meminfo. If things change in the future, we only have to change it in one place.

Aplicação do novo cálculo ao Conky

A aplicação dessa mudança no Conky foi pedida em Junho 2019 e efetuada em Outubro 2019 (acima), — cerca de 10 meses antes de o Conky 1.11.6 chegar às distros rolling-release (e ao Fedora).

Foi um movimento em direção a um cálculo “tecnicamente mais correto”, — mas quebrou a consistência com as versões anteriores do Conky, dificultando a comparação entre diferentes distros Linux.


Comparação precária (I)


Memória RAM usada, segundo Conky, htop, inxi, free, top

Outubro 2020 - Em um primeiro momento, incluir o htop no Conky me pareceu um modo prático de ter sempre o cálculo “antigo” diante dos olhos, — para uma comparação (precária) do uso inicial de Memória RAM entre distros Linux que agora têm versões do Conky com cálculos diferentes.

Indicações iguais de uso de RAM pelo Conky e pelo htop, em 2019

A paridade do htop com o “cálculo antigo” do Conky — exceto no openSUSE Leap (que não uso mais) — era coisa observada desde 2017.

------------------------ Conky vs. htop – RAM Memory usage -------------------------

     Date        Time     Distro                Conky     htop      A-B        A/B

2017 Jun. 14   16:11:06   Debian testing          651      636     + 15     +  2.36%
2017 Jun. 14   17:30:52   Debian testing          547      547
2017 Jun. 14   17:34:07   Debian testing          489      487     +  2     +  0.41%
2017 Jun. 16   02:07:16   Debian testing          441      441
2017 Jun. 16   02:07:20   Debian testing          488      486     +  2     +  0.41%
2017 Jun. 16   02:08:08   Debian testing          450      450
2017 Jun. 16   04:41:51   Debian testing          448      448

2017 Jun. 14   17:23:28   Kubuntu 16.04           538      538
2017 Jun. 14   17:26:26   Kubuntu 16.04           479      479
2017 Jun. 14   17:28:21   Kubuntu 16.04           461      461
2017 Jun. 15   14:20:28   Kubuntu 16.04           457      456     +  1     +  0.22%
2017 Jun. 15   14:24:49   Kubuntu 16.04           459      459
2017 Jun. 15   14:26:00   Kubuntu 16.04           435      435
2017 Jun. 16   02:21:56   Kubuntu 16.04           431      431
2017 Jun. 17   16:22:41   Kubuntu 16.04           444      444

2017 Jun. 14   16:22:25   KDE Neon (16.04)        482      482
2017 Jun. 14   17:37:32   KDE Neon (16.04)        487      478     +  9     +  1.88%
2017 Jun. 14   17:40:34   KDE Neon (16.04)        428      420     +  8     +  1.90%
2017 Jun. 16   01:46:54   KDE Neon (16.04)        431      432     -  1     -  0.23%
2017 Jun. 16   01:46:56   KDE Neon (16.04)        436      436
2017 Jun. 16   01:47:47   KDE Neon (16.04)        430      430
2017 Jun. 16   03:00:58   KDE Neon (16.04)        433      433
2017 Jun. 16   05:30:43   KDE Neon (16.04)        420      420

2017 Jun. 14   13:44:11   Mint 18 KDE (16.04)     638      638
2017 Jun. 14   16:53:41   Mint 18 KDE (16.04)     558      558
2017 Jun. 14   17:09:59   Mint 18 KDE (16.04)     510      510
------------------------------------------------------------------------------------
     Date        Time     Distro                Conky     htop      A-B        A/B

2017 Jun. 14   13:19:36   Arch                    556      552     +  4     +  0.72%
2017 Jun. 14   16:58:18   Arch                    549      546     +  3     +  0.55%
2017 Jun. 14   17:00:08   Arch                    467      466     +  1     +  0.21%
2017 Jun. 14   18:23:08   Arch                    471      474     -  3     -  0.63%
2017 Jun. 15   14:44:56   Arch                    475      478     -  3     -  0.63%
2017 Jun. 15   14:46:13   Arch                    458      458
2017 Jun. 15   15:01:01   Arch                    477      475     +  2     +  0.42%
2017 Jun. 15   15:02:18   Arch                    457      457
2017 Jun. 15   19:49:33   Arch                    465      465
2017 Jun. 15   19:49:42   Arch                    490      490
2017 Jun. 15   19:50:19   Arch                    449      449
2017 Jun. 15   19:50:49   Arch                    451      451
2017 Jun. 16   05:36:30   Arch                    482      482
2017 Jun. 16   05:37:12   Arch                    466      466

2017 Jun. 14   18:20:05   Arch  (2)               438      439     -  1     -  0.23%
2017 Jun. 14   18:21:36   Arch  (2)               436      432     +  4     +  0.93%
2017 Jun. 15   14:47:53   Arch  (2)               445      445
2017 Jun. 15   14:49:11   Arch  (2)               418      418
2017 Jun. 15   14:51:19   Arch  (2)               419      419
2017 Jun. 15   14:52:42   Arch  (2)               394      394
2017 Jun. 15   14:56:10   Arch  (2)               420      417     +  3     +  0.72%
2017 Jun. 15   14:57:31   Arch  (2)               405      405
------------------------------------------------------------------------------------
     Date        Time     Distro                Conky     htop      A-B        A/B

2017 Jun. 14   16:32:58   Mageia 6 (sta2)         664      664
2017 Jun. 14   17:43:23   Mageia 6 (sta2)         670      666     +  4     +  0.60%
2017 Jun. 14   17:47:01   Mageia 6 (sta2)         618      618
2017 Jun. 15   22:21:21   Mageia 6 (sta2)         605      584     + 21     +  3.60%
2017 Jun. 15   22:22:04   Mageia 6 (sta2)         596      596
2017 Jun. 15   22:22:34   Mageia 6 (sta2)         599      599
2017 Jun. 15   22:47:51   Mageia 6 (sta2)         583      582     +  1     +  0.17%
2017 Jun. 15   22:48:32   Mageia 6 (sta2)         554      554
2017 Jun. 15   23:19:17   Mageia 6 (sta2)         580      580
2017 Jun. 15   23:20:02   Mageia 6 (sta2)         554      554
2017 Jun. 15   23:20:32   Mageia 6 (sta2)         555      554     +  1     +  0.18%
2017 Jun. 15   23:40:21   Mageia 6 (sta2)         576      574     +  2     +  0.35%
2017 Jun. 15   23:41:10   Mageia 6 (sta2)         550      550
2017 Jun. 16   01:18:54   Mageia 6 (sta2)         582      581     +  1     +  0.17%
2017 Jun. 16   01:19:39   Mageia 6 (sta2)         556      556
2017 Jun. 16   04:56:03   Mageia 6 (sta2)         579      579
2017 Jun. 16   04:56:38   Mageia 6 (sta2)         561      561
------------------------------------------------------------------------------------
     Date        Time     Distro                Conky     htop       A-B        A/B

2017 Jun. 14   15:29:53   openSUSE Leap 42.2      590      480     + 110    + 22.92%
2017 Jun. 14   15:33:25   openSUSE Leap 42.2      577      475     + 102    + 21.47%
2017 Jun. 14   17:14:40   openSUSE Leap 42.2      594      481     + 113    + 23.49%
2017 Jun. 14   17:17:36   openSUSE Leap 42.2      528      437     +  91    + 20.82%
2017 Jun. 15   16:32:21   openSUSE Leap 42.2      517      413     + 104    + 25.18%
2017 Jun. 15   16:32:25   openSUSE Leap 42.2      549      448     + 101    + 22.54%
2017 Jun. 15   16:33:43   openSUSE Leap 42.2      528      470     +  58    + 12.34%
2017 Jun. 15   16:34:42   openSUSE Leap 42.2      622      575     +  47    +  8.17%
2017 Jun. 15   16:39:00   openSUSE Leap 42.2      533      449     +  84    + 18.71%
2017 Jun. 15   16:42:32   openSUSE Leap 42.2      537      437     + 100    + 22.88%
2017 Jun. 15   17:13:52   openSUSE Leap 42.2      594      565     +  29    +  5.13%
2017 Jun. 15   17:59:12   openSUSE Leap 42.2      529      434     +  95    + 21.89%
2017 Jun. 15   18:00:47   openSUSE Leap 42.2      516      457     +  59    + 12.91%
2017 Jun. 15   18:01:47   openSUSE Leap 42.2      516      457     +  59    + 12.91%
2017 Jun. 16   05:10:25   openSUSE Leap 42.2      536      432     + 104    + 24.07%
2017 Jun. 16   05:10:53   openSUSE Leap 42.2      527      455     +  72    + 15.82%

                                             openSUSE Average:     +  83    + 18.20%
------------------------------------------------------------------------------------
Uso inicial de RAM, segundo o htop (Outubro 2020)

No gráfico (acima), por ordem crescente dos números do htop, salta à vista quais distros usam mais ou menos Memória RAM, — sem dependermos da versão do Conky em cada uma.

  • Todas as distros Linux com KDE (+ widgets Weather e Gealach), sem verificação automática de atualizações, sem PIM, sem indexação pelo Baloo (Filesearch), bem como desativados mais alguns “efeitos” e serviços. — Mageia sem verificações automáticas de MSEC. — Apenas no openSUSE, serviços de manutenção do Snapper + BtrFS habilitados. — No PCLinuxOS, o uso de Memória RAM está um pouco aumentado, desde uma configuração de UXA em Março 2020.

Infelizmente, incluir o htop no Conky exige instalar aha e html2text em todas as distros — o que nem sempre é simples e fácil.


Reviravolta (Conky 1.12.1)


Situação após nova reviravolta do Conky

Em Março 2021, o Conky 1.12.1 fez outra reviravolta de 180º — mas, em vez de restabelecer a paridade com o htop, foi mais além, passando a emparelhar com o free e o top — ferramentas do pacote procps.

De repente, openSUSE e Fedora, que estão entre as distros Linux mais “pesadas” da minha coleção, parecem usar menos Memória RAM (540 MiB) do que o Arch (845 MiB!) e o MX Linux (578 MiB), — que estão entre as mais “leves”, quando se usa a mesma medida.

Isso, porque em Novembro 2020 o Arch adotou o Conky 1.11.6 — e em Março 2021 o Conky 1.12.1 chegou ao openSUSE Tumbleweed e ao Fedora:

Arch        2020 Nov 27   Conky 1.11.6

PCLinuxOS   2021 Mar 15   Conky 1.12.1
Void        2021 Mar 15   Conky 1.12.1
Fedora      2021 Mar 21   Conky 1.12.1
openSUSE    2021 Mar 29   Conky 1.12.1

Se eu tinha a esperança de que, dentro de alguns anos, todas as distros chegassem ao Conky 1.11.6, e pudessem voltar a ser comparadas de modo consistente, agora a situação piorou — pois em vez de 2 critérios diferentes, passamos a ter versões do Conky usando nada menos que 3 critérios — e a perspectiva de unificação talvez fique adiada para um futuro ainda mais distante.

  • Em Maio 2021, o Conky 1.12.2 restabeleceu o cálculo anterior (1.11.6) no openSUSE Tumbleweed — o que renova minha esperança.
Conky 1.10.8   =  htop   (htop)        Neon, Mint, MX Linux
Conky 1.11.6   >  htop   (new calc)    Arch, Debian testing, Mageia 8
Conky 1.12.1   <  htop   (free, top)   openSUSE Tumbleweed, Fedora 33, PCLinuxOS, Void
Conky 1.12.2   >  htop   (new calc)    openSUSE Tumbleweed

Comparação precária (II)


Comparação do uso de RAM pelo free (Abril 2021)

Esta nova mudança brusca de rumo do Conky — a segunda, em menos de 1 ano — me levou a pensar em uma solução mais simples, como os comandos free e top, do pacote procps

Embora usem um cálculo que ainda não sei qual é, pelo menos no momento guardam consistência em todas as distros — requisito elementar para qualquer comparação — e são os mais fáceis de incluir no Conky, para ter sempre diante dos olhos.

Ordenando a mesma lista pelos números do htop, apenas se invertem alguns pares — MX e Slackware, Mint e Mageia, Fedora e openSUSE, Debian e PCLinuxOS — separados uns dos outros por 3 a 19 MiB segundo o free; ou por 9 a 24 MiB segundo o htop.

RAM usage at startup --- sorted...

by free                   by htop

Void                      Void
Arch                      Arch
Slackware                 Mx Linux
Mx Linux                  Slackware
Neon                      Neon
Mageia 8                  Mint 20
Mint 20                   Mageia 8
Fedora                    openSUSE
openSUSE                  Fedora
Debian                    PCLinuxOS
PCLinuxOS                 Debian

Essas diferenças cabem dentro das oscilações que ocorrem a cada segundo — mesmo quando se deixa o computador “parado” por 10 minutos após o boot. — A rigor, cada um desses pares de distros tem uso praticamente igual de Memória RAM, nos limites da precisão ao alcance do usuário comum.

Distro     free  Diff   htop   Diff

Void        322          488
Arch        374          541
Slackware   410          565
Mx Linux    424 __ 14    541 __ -24
Neon        429          591
Mageia 8    451          610
Mint 20     461 __ 10    601 __  -9
Fedora      511          670
openSUSE    530 __ 19    651 __ -19
Debian      552	         710
PCLinuxOS   555 __  3    691 __ -19

Por isso, tanto o free / top quanto o htop permitem comparação entre essas distros, uma vez que cada um deles usa um mesmo cálculo em todas elas. — A diferença, em termos práticos, é que free / top é mais fácil de exibir no Conky, em todas as distros.


Perspectivas


Versões do Conky e demais ferramentas no início de Maio

Maio 2021 - Uma série de novos realinhamentos me levou a ampliar este exame a todas as ferramentas mais populares de medição do uso de Memória RAM.

Em 22 Abril 2021, o desenvolvedor do Conky Brenden Matthews (brndnmtthws) adicionou um PR (pull request) #1092, no sentido de (a) Retornar ao “cálculo novo” sugerido por Linus Torvalds em 2014, — e (b) introduzir uma variável “legacyfree”, para quem preferir a compatibilidade com os comandos free / top.

Dias depois, o Conky 1.12.2 já restabelecia o “cálculo novo” no openSUSE Tumbleweed — o que faz prever o rápido desaparecimento da paridade com o free / top também no Arch, Fedora, PCLinuxOS, Void e Manjaro, a menos que a equipe de alguma dessas distros resolva ter ideias diferenciadas sobre o assunto. — Quanto às distros “estáveis”, no devido tempo, não terão motivos para se deter no Conky 1.12.1, já dispondo da versão 1.12.2 ou superior.

Até o momento, ainda não encontrei a variável “legacyfree”.

Além do Conky, o inxi também já adotou o “cálculo novo”, pelo menos desde sua versão 3.1.00 (2020-11-11). — Restam versões anteriores no KDE Neon, Linux Mint 20 (LTS “Focal Fossa”) e no MX Linux (Debian stable 10 ”Buster”).

O screenfetch também já adotou o “cálculo novo”, mas não consegui descobrir exatamente quando. A versão 3.8.0 (MX Linux) ainda mostra o mesmo valor indicado por free / top — mas o Changelog da versão seguinte (3.9.1, atual) não diz absolutamente nada sobre isso.

Enfim, já faz algum tempo que Chris Cheney convenceu os desenvolvedoresdo htop a adotarem o “cálculo novo”, proposto há 7 anos por Linus Torvalds. — É de se esperar que seja implementado em uma próxima versão.

O neofetch permanece no “cálculo antigo” — exceto no Slackware, apesar de indicar a mesma versão de outras distros.

  • ATT - Estes números foram levantados após atualizar as distros no Domingo, 2 Maio 2021, e refletem unicamente um momento 10 minutos uptime, sem a abertura de nenhum outro aplicativo.


Ferramentas e medições


Inclusão do screenfetch, htop, inxi, screenfetch etc. no Conky

Testei o “cálculo antigo” a partir da descrição textual de Linus Torvalds, — sem as “marcas d'água”, — e o resultado se mostrou sempre bastante próximo do indicado pelo htop:

/proc/meminfo -- (Old calc):

Mem used = MemTotal - [MemFree + Active(file) + Inactive(file) + SReclaimable]

/proc/meminfo -- (New calc):

Mem used = MemTotal - MemAvailable 

Para obter esses (e outros) valores, criei um script “RAM.sh” — que salva essas informações em um arquivo com o nome da distro, na pasta pessoal — e o remove, no final, para uma pasta com os das demais distros:

echo "------------------------------------------------------------------"                              >> RAM_00-Distro.txt
date                                                                                                   >> RAM_00-Distro.txt
echo "------------------------------------------------------------------"                              >> RAM_00-Distro.txt
uptime                                                                                                 >> RAM_00-Distro.txt
uptime -s                                                                                              >> RAM_00-Distro.txt
echo "------------------------------------------------------------------"                              >> RAM_00-Distro.txt
echo "           ----------   free   ----------"                                                       >> RAM_00-Distro.txt
free -m                                                                                                >> RAM_00-Distro.txt
echo "------------------------------------------------------------------"                              >> RAM_00-Distro.txt
echo "           ----------   top    ----------"                                                       >> RAM_00-Distro.txt
top -E m -b -n 1 | grep buff                                                                           >> RAM_00-Distro.txt
echo "------------------------------------------------------------------"                              >> RAM_00-Distro.txt
echo "           ---------- neofetch ----------"                                                       >> RAM_00-Distro.txt
neofetch  --stdout | grep "Memory"                                                                     >> RAM_00-Distro.txt
echo "------------------------------------------------------------------"                              >> RAM_00-Distro.txt
echo "           ----------   htop   ----------"                                                       >> RAM_00-Distro.txt
export TERM=xterm; echo q | htop | aha --line-fix | html2text | grep "/15"                             >> RAM_00-Distro.txt
### --- without "aha" ---> ### export TERM=xterm; echo q | htop                                          >> RAM_00-Distro.txt
echo "------------------------------------------------------------------"                              >> RAM_00-Distro.txt
echo "           ----------   inxi   ----------"                                                       >> RAM_00-Distro.txt
inxi -m                                                                                                >> RAM_00-Distro.txt
echo "------------------------------------------------------------------"                              >> RAM_00-Distro.txt
echo "           -------- screenfetch ---------"                                                       >> RAM_00-Distro.txt
screenfetch -n -N -E | grep "RAM"                                                                      >> RAM_00-Distro.txt
echo "------------------------------------------------------------------"                              >> RAM_00-Distro.txt
echo "           -------   proc/meminfo  ------"                                                       >> RAM_00-Distro.txt
cat /proc/meminfo | grep "MemTotal\|MemFree\|Active(file)\|Inactive(file)\|SReclaimable\|MemAvailable" >> RAM_00-Distro.txt
echo "------------------------------------------------------------------"                              >> RAM_00-Distro.txt
conky -v | grep compiled                                                                               >> RAM_00-Distro.txt
free -V                                                                                                >> RAM_00-Distro.txt
top -v | grep procps                                                                                   >> RAM_00-Distro.txt
neofetch --version                                                                                     >> RAM_00-Distro.txt
htop --version                                                                                         >> RAM_00-Distro.txt
inxi -V | grep inxi                                                                                    >> RAM_00-Distro.txt
screenfetch -V | grep Version                                                                          >> RAM_00-Distro.txt
echo "------------------------------------------------------------------"                              >> RAM_00-Distro.txt
date                                                                                                   >> RAM_00-Distro.txt
echo "------------------------------------------------------------------"                              >> RAM_00-Distro.txt
mv RAM_00-Distro.txt /PATH/
xxx

O arquivo-texto produzido é bastante compacto, o que facilita transferir os dados para uma planilha.

Para executar “RAM.sh” 10 minutos após o boot criei um agendamento:

$ crontab -l
@reboot sleep 600; bash RAM.sh

Após 11 minutos uptime, capturo a tela com os números exibidos no Conky:

RAM usage:

Conky       ${alignr}${mem}                    .
free        ${alignr}${execi 10 free -m | grep Mem | cut -c 25-35} MiB                    .
top         ${alignr}${execi 10 top -E m -b -n 1  | grep buff | cut -c 41-50} MiB                    .
neofetch    ${alignr}${execi 10 neofetch  --stdout | grep "Memory" | cut -c 8-15}                    .
htop        ${alignr}${execi 10 export TERM=xterm; echo q | htop | aha --line-fix | html2text | grep "/15" | cut -b 25-30}iB                    .
inxi        ${alignr}${execi 10 inxi --memory-short | grep used | cut -b 53-61}                    .
screenfetch ${alignr}${execi 10 screenfetch -n -N | grep "RAM" | cut -c 7-13}                    .

O ciclo de 10 segundos evita oscilações súbitas nesses indicadores. — Assim que se atualizam, basta anotar (à mão) só o número indicado pelo próprio Conky, antes de acionar o gnome-screenshot, — pois este, às vezes, captura um valor já alterado por ele mesmo.

Referências:


Média das medidas no arquivo-texto e na captura de tela

A partir do arquivo-texto e da captura de tela, tirei a média dos números em duplicata.


_______________________
• Publicado em 20 Outubro 2020 e atualizado até 5 Maio 2021.

— … ≠ • ≠ … —


Ferramentas &tc.