Viernes, Agosto 18, 2017

Monitorizar nuestro sistema desde una aplicación en C++11

14255861975_42cb043745_k.jpg

Nuestros programas, muchas veces necesitan conocer información sobre el ordenador donde se están ejecutando. Una característica muy interasante y útil (para mi gusto) es que los sistemas Unix nos proporcionan una interfaz para conocer muchas cosas a través del sistema de archivos, de esta forma podemos conocer la información estemos donde estemos y usemos en lenguaje que usemos (no tenemos que tener una API en nuestro lenguaje que pida al sistema la información ni nada). Bueno, muchas veces, sí que tenemos una API que nos mastica un poco la información para no trabajar tanto…

Eso sí, esta información en bruto, tendremos que transformarla y tratarla de alguna forma para que se ajuste a nuestras necesidades.
Por ejemplo, si entramos en /proc, podemos ver multitud de ficheros con mucha información. El más característico es cpuinfo, al que podemos hacerle un simple cat y nos devolverá información, algo parecido a esto:

Pero tenemos otros más como /proc/uptime, /proc/loadavg (estos dos podemos verlos mejor desde terminal usando $ uptime), /proc/stat, con estadísticas de sistema, y muchos más. Sólo tenemos que mirar el manual (man proc).

Para facilitarnos un poco el trabajo, si estamos programando en C++11 o superior, podemos utilizar linuxmon, una biblioteca sólo con una cabecera, pensada sobre todo para hacer múltiples llamadas en el tiempo a sus métodos, controlando si se debe pedir la información de nuevo, o sacarla del último valor pedido. Proporcionándonos además, métodos para extraer la información en unidades adaptadas para el humano (tiempo en horas, minutos, segundos, espacio en bytes, kilobytes, megabytes, etc).

Algunas de las cosas que podemos hacer son:

 
  • Información del general: tiempo online, threads en ejecución, carga del sistema, etc.
  • Memoria: RAM total, usada, libre, buffers, swap, etc
  • Disco: dispositivos montados, espacio total, libre y usado de cada uno de ellos, con opción de saber incluso si el dispositivo está respondiendo o no.
  • Procesos: total en ejecución, % de CPU De cada uno de ellos, memoria utilizada

Junto con el .h , he incluido un ejemplo (sample01) que hace una llamada a casi todos los métodos que nos proporciona la biblioteca):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "umon.h"
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
  cout << "sysinfo() and related access methods: "<<endl;
  cout << " * Total amount of RAM: "<<Umon::size(Umon::totalram())<<endl;
  cout << " * Free RAM: "<<Umon::size(Umon::freeram())<<endl;
  cout << " * Used RAM: "<<Umon::size(Umon::usedram())<<endl;
  cout << " * Used RAM (with buffers): "<<Umon::size(Umon::usedramb())<<endl;
  cout << " * Shared RAM: "<<Umon::size(Umon::sharedram())<<endl;
  cout << " * Buffer RAM: "<<Umon::size(Umon::bufferram())<<endl;
  cout << " * Total Swap: "<<Umon::size(Umon::totalswap())<<endl;
  cout << " * Free Swap: "<<Umon::size(Umon::freeswap())<<endl;
  cout << " * Used Swap: "<<Umon::size(Umon::usedswap())<<endl;
  cout << " * Total High Memory: "<<Umon::size(Umon::totalHighMem())<<endl;
  cout << " * Free High Memory: "<<Umon::size(Umon::freeHighMem())<<endl;
  cout << " * Memory Unit: "<<Umon::size(Umon::memoryUnitSize())<<endl;
  cout << " * Seconds since uptime: "<<Umon::uptime()<<endl;
  cout << " * Total threads: "<<Umon::totalThreads()<<endl;
  cout << " * System load: "<<Umon::sysload1u()<<" "<<Umon::sysload5u()<<" "<<Umon::sysload15u()<<endl;
  cout << " * System load: "<<Umon::sysload1()<<" "<<Umon::sysload5()<<" "<<Umon::sysload15()<<endl;
  cout << "system configuration information: "<<endl;
  cout << " * Max argument length: "<<Umon::maxArgumentsLength()<<endl;
  cout << " * Max processes per user: "<<Umon::maxProcessesPerUser()<<endl;
  cout << " * Clock Ticks Per Second: "<<Umon::ticksPerSecond()<<endl;
  cout << " * Max opened files: "<<Umon::maxOpenedFiles()<<endl;
  cout << " * Memory page size: "<<Umon::size(Umon::pageSize())<<endl;
  cout << " * Total RAM pages: "<<Umon::totalPagesRam()<<endl;
  cout << " * Available RAM pages: "<<Umon::availablePagesRam()<<endl;
  cout << " * Processors configured: "<<Umon::cpuCount()<<endl;
  cout << " * Processors online: "<<Umon::onlineCpuCount()<<endl;
  cout << "mount points information:"<<endl;
  Umon::valueCheckInterval(500);
  Umon::Mounts::MountPoints mp = Umon::Mounts::mountsInfo();
  for (Umon::Mounts::MountPoint m : mp)
    {
      cout << "  - "<<m.fileSystem<<" "<<m.mountPoint<<" "<<m.type<<" "<<m.options<<" "<<m.dumpFrequency<<" "<<m.passNumber<<"=>"<<m.freeSpace()<<"("<<Umon::size(m.freeSpace())<<")"<<m.totalSpace()<<" "<<m.usedSpace()<<" "<<m.usedRatio()<<" "<<m.statfs_errno<<endl;
    }
  Umon::Proc::buildProcSummary();
  cout << "---------------------------___"<<endl;
  cout << "Process count: "<<Umon::Proc::processCount()<<std::endl;
  cout << "TTBS: "<<Umon::Proc::timeToBuildSummary()<<endl;
  cout << "Free space on / : "<<Umon::size(Umon::Mounts::getFreeSpace("/"))<<endl;
  cout << "Used space on / : "<<Umon::size(Umon::Mounts::getUsedSpace("/"))<<endl;
  cout << "Total space on / : "<<Umon::size(Umon::Mounts::getTotalSpace("/"))<<endl;
  cout << "Used ratio on / : "<<Umon::Mounts::getUsedRatio("/")<<endl;
  cout << "Number of apache processes: "<<Umon::Proc::countProcess("apache2")<<endl;
  cout << "Total PCPU of Emacs: "<<Umon::Proc::totalPCPU("emacs")<<endl;
  Umon::Proc::MultiProc p = Umon::Proc::getByName("apacho");
  cout << p.name<<endl;
  for (auto sp : Umon::Proc::getAllProcs())
    {
      cout << "["<<sp.first<<"] "<<sp.second.name<<". TotalCPU: "<<sp.second.totalpcpu<<endl;
    }
  cout << "Processes with CPU >= 2%"<<endl<<"----------------------------"<<endl;
  for (auto sp : Umon::Proc::getByPCPU(2, true))
    {
      cout << "["<<sp.pid<<"] "<<sp.name<<". TotalCPU: "<<sp.totalpcpu<<" Vsize: "<<Umon::size(sp.vsize)<<" RSS: "<<Umon::size(sp.rss)<<endl;
    }
  cout << "Processes with all threads CPU >= 5%"<<endl<<"----------------------------"<<endl;
  for (auto sp : Umon::Proc::getByPCPUCol(3, true))
    {
      cout << "["<<sp.first<<"] "<<sp.second.name<<". TotalCPU: "<<sp.second.totalpcpu<<endl;
    }
  cout << "Processes with Vsize >= 1Gb"<<endl<<"----------------------------"<<endl;
  for (auto sp : Umon::Proc::getByVsize(1024*1024*1024))
    {
      cout << "["<<sp.pid<<"] "<<sp.name<<". TotalCPU: "<<sp.totalpcpu<<" Vsize: "<<Umon::size(sp.vsize)<<" RSS: "<<Umon::size(sp.rss)<<endl;
    }
  cout << "Processes with all threads Vsize >= 2Gb"<<endl<<"----------------------------"<<endl;
  for (auto sp : Umon::Proc::getByVsizeCol((unsigned long)2*1024*1024*1024))
    {
      cout << "["<<sp.first<<"] "<<sp.second.name<<". TotalCPU: "<<sp.second.totalpcpu<<" Vsize: "<<Umon::size(sp.second.totalvsize)<<" RSS: "<<Umon::size(sp.second.totalrss)<<endl;
    }

  cout << "Value duration: "<<Umon::valueDuration()<<endl;
  cout << "Sets value duration to 1.5: "<<Umon::valueDuration(1.5)<<endl;
  cout << "Value duration: "<<Umon::valueDuration()<<endl;

  // sleep(1);
  // Umon::buildProcessSummary();
  // cout << "TTBS: "<<Umon::timeToBuildSummary()<<endl;
  // cout << "Process count: "<<Umon::processCount()<<std::endl;
  return 0;
}

Su salida será algo como esto:

sysinfo() and related access methods:
* Total amount of RAM: 7.581Gb
* Free RAM: 1.672Gb
* Used RAM: 5.909Gb
* Used RAM (with buffers): 5.868Gb
* Shared RAM: 0.000bytes
* Buffer RAM: 41.551Mb
* Total Swap: 2.796Gb
* Free Swap: 1.154Gb
* Used Swap: 1.642Gb
* Total High Memory: 0.000bytes
* Free High Memory: 0.000bytes
* Memory Unit: 1.000bytes
* Seconds since uptime: 1163979
* Total threads: 942
* System load: 164160 137472 130560
* System load: 2.50488 2.09766 1.99219
system configuration information:
* Max argument length: 2097152
* Max processes per user: 61861
* Clock Ticks Per Second: 100
* Max opened files: 1024
* Memory page size: 4.000Kb
* Total RAM pages: 1987297
* Available RAM pages: 438398
* Processors configured: 4
* Processors online: 4
mount points information:
– /dev/sda1 / ext4 rw,errors=remount-ro 0 0=>2932584448(2.731Gb)6358720512 3079528448 0.538809 0
– proc /proc proc rw,noexec,nosuid,nodev 0 0=>0(0.000bytes)0 0 0 0
– sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0=>0(0.000bytes)0 0 0 0
– none /sys/fs/cgroup tmpfs rw 0 0=>4096(4.000Kb)4096 0 0 0
– none /sys/fs/fuse/connections fusectl rw 0 0=>0(0.000bytes)0 0 0 0
– none /sys/kernel/debug debugfs rw 0 0=>0(0.000bytes)0 0 0 0
– none /sys/kernel/security securityfs rw 0 0=>0(0.000bytes)0 0 0 0
– udev /dev devtmpfs rw,mode=0755 0 0=>4054056960(3.776Gb)4054151168 94208 2.32374e-05 0
– devpts /dev/pts devpts rw,noexec,nosuid,gid=5,mode=0620 0 0=>0(0.000bytes)0 0 0 0
– tmpfs /run tmpfs rw,noexec,nosuid,size=10%,mode=0755 0 0=>812498944(774.859Mb)813998080 1499136 0.00184169 0
– none /run/lock tmpfs rw,noexec,nosuid,nodev,size=5242880 0 0=>5242880(5.000Mb)5242880 0 0 0
– none /run/shm tmpfs rw,nosuid,nodev 0 0=>4015366144(3.740Gb)4069982208 54616064 0.0134192 0
– none /run/user tmpfs rw,noexec,nosuid,nodev,size=104857600,mode=0755 0 0=>104824832(99.969Mb)104857600 32768 0.0003125 0
– none /sys/fs/pstore pstore rw 0 0=>0(0.000bytes)0 0 0 0
– /dev/sda5 /home ext4 rw 0 0=>8878333952(8.269Gb)97829072896 83957673984 0.909246 0
– /dev/sda2 /usr ext4 rw 0 0=>4186050560(3.899Gb)11734478848 6928740352 0.643269 0
– /dev/sda6 /var ext4 rw 0 0=>4506378240(4.197Gb)6609739776 1744007168 0.318222 0
– binfmt_misc /proc/sys/fs/binfmt_misc binfmt_misc rw,noexec,nosuid,nodev 0 0=>0(0.000bytes)0 0 0 0
– rpc_pipefs /run/rpc_pipefs rpc_pipefs rw 0 0=>0(0.000bytes)0 0 0 0
– systemd /sys/fs/cgroup/systemd cgroup rw,noexec,nosuid,nodev,none,name=systemd 0 0=>0(0.000bytes)0 0 0 0
– fuse-zip /home/gaspy/Notas/Proyectos fuse.fuse-zip rw,nosuid,nodev,user=gaspy 0 0=>8878333952(8.269Gb)8878333952 0 0 0
– 192.168.0.1:/mnt/descargas /mnt/burraco nfs rw,noexec,nosuid,nodev,addr=192.168.0.1 0 0=>97077690368(90.411Gb)472416256000 351317786624 0.794508 0
– /dev/sdb1 /media/gaspy/Oregano ext4 rw,nosuid,nodev,uhelper=udisks2 0 0=>460049653760(428.455Gb)1504392990720 967900962816 0.694196 0
– /dev/sdc1 /media/gaspy/9016-4EF8 vfat rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,flush,uhelper=udisks2 0 0=>17741643776(16.523Gb)31998345216 14256701440 0.445545 0
—————————___
Process count: 320
TTBS: 3.01e-07
Free space on / : 2.731Gb
Used space on / : 2.868Gb
Total space on / : 5.922Gb
Used ratio on / : 0.538809
Number of apache processes: 5
Total PCPU of Emacs: 0

[1] init. TotalCPU: 0.000277496
[2] kthreadd. TotalCPU: 2.92101e-05
[3] ksoftirqd/0. TotalCPU: 0.00327325
[5] kworker/0:0H. TotalCPU: 0
[7] rcu_sched. TotalCPU: 0.0560998
[8] rcuos/0. TotalCPU: 0.0211877
[9] rcuos/1. TotalCPU: 0.0455988
[10] rcuos/2. TotalCPU: 0.0130243
[11] rcuos/3. TotalCPU: 0.0125251
[12] rcuos/4. TotalCPU: 0

[29951] bash. TotalCPU: 0.000273828
[31024] bash. TotalCPU: 5.9878e-05
[31469] perl. TotalCPU: 9.75045e-05
[31472] ssh. TotalCPU: 0.00029825
[32066] scsi_eh_24. TotalCPU: 0
[32067] usb-storage. TotalCPU: 0.0131616
[32518] dirmngr. TotalCPU: 0.0189267
Processes with CPU >= 2%
—————————-
[1323] Xorg. TotalCPU: 3.96091 Vsize: 1.236Gb RSS: 106.754Kb
[2490] kwin. TotalCPU: 2.2151 Vsize: 3.275Gb RSS: 33.426Kb
[2516] plasma-desktop. TotalCPU: 2.24012 Vsize: 3.542Gb RSS: 43.729Kb
[2799] owncloud. TotalCPU: 2.92701 Vsize: 1.362Gb RSS: 5.068Kb
[6542] firefox. TotalCPU: 35.3001 Vsize: 3.443Gb RSS: 393.865Kb
[12888] spotify. TotalCPU: 2.30546 Vsize: 2.548Gb RSS: 41.952Kb
[13849] plugin-containe. TotalCPU: 23.2261 Vsize: 921.301Mb RSS: 37.011Kb
[27198] skype. TotalCPU: 4.7133 Vsize: 779.379Mb RSS: 22.702Kb
Processes with all threads CPU >= 5%
—————————-
[Xorg] Xorg. TotalCPU: 3.96091
[firefox] firefox. TotalCPU: 35.3001
[plugin-containe] plugin-containe. TotalCPU: 23.2261
[skype] skype. TotalCPU: 4.7133
Processes with Vsize >= 1Gb
—————————-
[973] console-kit-dae. TotalCPU: 4.20971e-05 Vsize: 2.005Gb RSS: 340.000bytes
[1323] Xorg. TotalCPU: 3.96091 Vsize: 1.236Gb RSS: 106.754Kb
[2272] konqueror. TotalCPU: 0.265112 Vsize: 2.299Gb RSS: 31.187Kb
[2273] kded4. TotalCPU: 0.0397305 Vsize: 1.631Gb RSS: 6.786Kb
[2313] kactivitymanage. TotalCPU: 0.00206277 Vsize: 1.037Gb RSS: 1.732Kb
[2433] thunderbird. TotalCPU: 0.855989 Vsize: 1.484Gb RSS: 78.741Kb
[2490] kwin. TotalCPU: 2.2151 Vsize: 3.275Gb RSS: 33.426Kb
[2516] plasma-desktop. TotalCPU: 2.24012 Vsize: 3.542Gb RSS: 43.729Kb
[2527] lancelot. TotalCPU: 0.0135038 Vsize: 1.236Gb RSS: 4.681Kb
[2736] knotify4. TotalCPU: 0.00227155 Vsize: 1.058Gb RSS: 2.871Kb
[2799] owncloud. TotalCPU: 2.92701 Vsize: 1.362Gb RSS: 5.068Kb
[2802] krunner. TotalCPU: 0.0185694 Vsize: 1.838Gb RSS: 9.333Kb
[2804] autokey-qt. TotalCPU: 0.191567 Vsize: 1.133Gb RSS: 5.515Kb
[2834] dropbox. TotalCPU: 0.0719725 Vsize: 2.658Gb RSS: 13.885Kb
[2862] kmix. TotalCPU: 0.0131878 Vsize: 1.061Gb RSS: 3.254Kb
[4793] TeamViewer.exe. TotalCPU: 0.592584 Vsize: 2.554Gb RSS: 44.861Kb
[4865] services.exe. TotalCPU: 0 Vsize: 2.524Gb RSS: 52.000bytes
[4871] explorer.exe. TotalCPU: 0.0223884 Vsize: 2.537Gb RSS: 436.000bytes
[6542] firefox. TotalCPU: 35.3001 Vsize: 3.443Gb RSS: 393.865Kb
[7378] perl. TotalCPU: 0.0124015 Vsize: 1.209Gb RSS: 6.765Kb
[11813] konqueror. TotalCPU: 0.125165 Vsize: 2.362Gb RSS: 15.325Kb
[12888] spotify. TotalCPU: 2.30546 Vsize: 2.548Gb RSS: 41.952Kb
[13025] SpotifyHelper. TotalCPU: 0.677923 Vsize: 1.011Gb RSS: 12.204Kb
[20392] mysqld. TotalCPU: 0.0942591 Vsize: 2.361Gb RSS: 3.739Kb
[28961] soffice.bin. TotalCPU: 0.156146 Vsize: 1.824Gb RSS: 23.255Kb
Processes with all threads Vsize >= 2Gb
—————————-
[SpotifyHelper] SpotifyHelper. TotalCPU: 0.898063 Vsize: 7.687Gb RSS: 95.598Kb
[TeamViewer.exe] TeamViewer.exe. TotalCPU: 0.592584 Vsize: 2.554Gb RSS: 44.861Kb
[console-kit-dae] console-kit-dae. TotalCPU: 4.20971e-05 Vsize: 2.005Gb RSS: 340.000bytes
[dropbox] dropbox. TotalCPU: 0.0719725 Vsize: 2.658Gb RSS: 13.885Kb
[explorer.exe] explorer.exe. TotalCPU: 0.0223884 Vsize: 2.537Gb RSS: 436.000bytes
[firefox] firefox. TotalCPU: 35.3001 Vsize: 3.443Gb RSS: 393.865Kb
[konqueror] konqueror. TotalCPU: 0.390277 Vsize: 4.661Gb RSS: 46.512Kb
[kwin] kwin. TotalCPU: 2.2151 Vsize: 3.275Gb RSS: 33.426Kb
[mysqld] mysqld. TotalCPU: 0.0942591 Vsize: 2.361Gb RSS: 3.739Kb
[perl] perl. TotalCPU: 0.0127119 Vsize: 2.121Gb RSS: 9.458Kb
[plasma-desktop] plasma-desktop. TotalCPU: 2.24012 Vsize: 3.542Gb RSS: 43.729Kb
[services.exe] services.exe. TotalCPU: 0 Vsize: 2.524Gb RSS: 52.000bytes
[spotify] spotify. TotalCPU: 2.30694 Vsize: 3.009Gb RSS: 42.731Kb

 

Foto: Billie Ward (Flickr CC)

Fuente: poesiabinaria

Compártelo. ¡Gracias!

 
Grupo Digital de Ayuda! Laboratorio Linux! - Linux para todos.

¿Quién está en línea?

Hay 45 invitados y ningún miembro en línea

Contador de Visitas

8925758
Hoy Hoy 135
Ayer Ayer 1107
Esta semana Esta semana 4094
Este mes Este mes 17944
Total de Visitas Total de Visitas 8925758

Día con más
visitantes

07-19-2017 : 1525

Gracias por su visita