En algunas ocasiones necesitamos saber qué memoria tiene nuestra máquina o servidor y a qué frecuencia está funcionando. Aunque influyen otros factores, estos son parámetros que necesitaremos conocer en el caso de, por ejemplo, querer ampliar la cantidad de memoria con la que contamos.
En Linux, existen varios comandos que pueden resultarnos especialmente útiles en casos como este:
Comando free
Este sencillo comando nos permitirá de forma rápida ver cuánta memoria tenemos, y cuánta hay ocupada actualmente. Por ejemplo, en una máquina con 12 GB de RAM tendríamos la siguiente salida:
[root@machine ~]# free total used free shared buffers cached Mem: 12186680 2377520 9809160 0 427888 796572 -/+ buffers/cache: 1153060 11033620 Swap: 2097144 48500 2048644
Pero a simple vista la información es algo confusa, y esto es debido a que la salida por defecto de este comando se muestra en Kilobytes, siendo una salida idéntica a si ejecutásemos el comando con la opción «-k».
Este comando, soporta diferentes parámetros de visualización que hacen la salida más intuitiva. Entre ellas están «-m» (Megabytes) y «-g» Gigabytes). Ejemplo:
[root@machine ~]# free -m total used free shared buffers cached Mem: 11901 2324 9576 0 418 777 -/+ buffers/cache: 1128 10772 Swap: 2047 47 2000 [root@bc01 ~]# free -g total used free shared buffers cached Mem: 11 2 9 0 0 0 -/+ buffers/cache: 1 10 Swap: 1 0 1
Bonus: Y si lo lanzamos en una máquina con 1 Terabyte de RAM…
[root@supernode ~]# free -g total used free shared buffers cached Mem: 1009 10 999 0 0 3 -/+ buffers/cache: 6 1003 Swap: 1 0 1
Comando vmstat
Este comando es parecido a free, pero su uso está más orientado a la estadística de uso de memoria, tanto física como virtual. Si lo usamos sin ningún parámetro muestra lo siguiente:
[root@supernode ~]# vmstat procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 324 0 0 443964416 221640 37652276 0 0 0 0 0 0 1 0 99 0 0
Donde podemos ver por columnas ciertos valores como memoria libre, memoria swap, procesos en ejecución, etc. Esta opción a simple vista puede ser algo confusa y poco más útil que la salida del comando free, por lo que el uso clásico que se le da a herramienta suele ser con la opción «-s», la cual nos muestra las estadísticas detalladas de uso de la memoria (de todos los tipos de memoria del sistema de hecho):
[root@supernode ~]# vmstat -s 1058702208 total memory 624236416 used memory 591003456 active memory 14968620 inactive memory 434465824 free memory 221644 buffer memory 37652288 swap cache 2097144 total swap 0 used swap 2097144 free swap 712171256 non-nice user cpu ticks 10079 nice user cpu ticks 47309179 system cpu ticks 50637698892 idle cpu ticks 219249 IO-wait cpu ticks 287 IRQ cpu ticks 938991 softirq cpu ticks 0 stolen cpu ticks 1487239 pages paged in 42845506 pages paged out 0 pages swapped in 0 pages swapped out 3201988556 interrupts 631003769 CPU context switches 1406018774 boot time 20166216 forks
Además, para facilitar la lectura podemos añadirle también el parámetro «-S M» para que nos muestre la información en Megabytes:
[root@bc25 ~]# vmstat -s -S M 1033888 M total memory 609938 M used memory 577479 M active memory 14617 M inactive memory 423950 M free memory 216 M buffer memory 36769 M swap cache 2047 M total swap 0 M used swap 2047 M free swap 712172203 non-nice user cpu ticks 10079 nice user cpu ticks 47309222 system cpu ticks 50637729405 idle cpu ticks 219249 IO-wait cpu ticks 287 IRQ cpu ticks 938991 softirq cpu ticks 0 stolen cpu ticks 1487239 pages paged in 42845510 pages paged out 0 pages swapped in 0 pages swapped out 3202002044 interrupts 631008244 CPU context switches 1406018774 boot time 20166219 forks
Comando lshw
El comando lshw es algo más avanzado y su funcionamiento es similar al clásico «ls» para listar el contenido de una carpeta, pero enfocado al hardware presente en la máquina. La mayoría de las distribuciones no lo incluyen por defecto. Por tanto sería necesario instalarlo previamente. Para ello:
En caso de que nuestra máquina sea Ubuntu/Debian
[root@debian ~]# apt-get update && apt-get install lshw
Y en caso de ser CentOS/RedHat
[root@centos ~]# yum clean expire-cache && yum install lshw
Una vez instalado este sencillo pero completo comando, podemos utilizarlo para encontrar información muy útil.
Si ejecutamos un simple «lshw» encontraremos una salida completa, con mucha información detallada sobre todo el hardware de la máquina. Pero centrándonos en el tema de artículo, si quisiésemos conocer, por ejemplo, cuántos módulos de memoria tenemos actualmente y su frecuencia, bastaría con hacer lo siguiente (tened en cuenta que puede tardar unos segundos en recopilar la información):
[root@machine ~]# lshw -short -C memory H/W path Device Class Description ====================================================== /0/0 memory 64KiB BIOS /0/4/5 memory 128KiB L1 cache /0/4/6 memory 1MiB L2 cache /0/4/7 memory 6MiB L3 cache /0/1b memory 4GiB System Memory /0/1b/0 memory DIMM Synchronous [empty] /0/1b/1 memory 4GiB DIMM DDR3 Synchronous 1333 MHz (0.8 ns) /0/1b/2 memory DIMM Synchronous [empty] /0/1b/3 memory DIMM Synchronous [empty]
En la salida del comando, podemos ver en las líneas resaltadas que contamos con 4 slots en los que podemos meter módulos de memoria, de los cuales 3 están vacíos (etiquetados como «[empty]«) y contamos con un módulo de 4 GigaBytes DDR3 a 1333 MHz.
Bonus: Y si lo lanzamos en una máquina con 1 Terabyte de RAM…
[root@supernode ~]# lshw -short -C memory H/W path Device Class Description ====================================================== /0/d memory 128KiB BIOS /0/0 memory 1TiB System Memory /0/0/0 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/1 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/2 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/3 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/4 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/5 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/6 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/7 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/8 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/9 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/a memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/b memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/c memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/d memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/e memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/f memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/10 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/11 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/12 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/13 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/14 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/15 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/16 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/17 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/18 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/19 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/1a memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/1b memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/1c memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/1d memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/1e memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/1f memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/20 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/21 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/22 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/23 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/24 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/25 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/26 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/27 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/28 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/29 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/2a memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/2b memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/2c memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/2d memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/2e memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/2f memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/30 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/31 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/32 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/33 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/34 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/35 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/36 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/37 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/38 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/39 memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/3a memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/3b memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/3c memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/3d memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/3e memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/0/3f memory 16GiB DIMM Synchronous 1067 MHz (0.9 ns) /0/96/97 memory 18MiB L3 cache /0/96/99 memory 256KiB L2 cache /0/96/9a memory 32KiB L1 cache /0/98 memory 32KiB L1 cache /0/9b/9c memory 18MiB L3 cache /0/9b/9e memory 256KiB L2 cache /0/9b/9f memory 32KiB L1 cache /0/9d memory 32KiB L1 cache /0/a0/a1 memory 18MiB L3 cache /0/a0/a3 memory 256KiB L2 cache /0/a0/a4 memory 32KiB L1 cache /0/a2 memory 32KiB L1 cache /0/a5/a6 memory 18MiB L3 cache /0/a5/a8 memory 256KiB L2 cache /0/a5/a9 memory 32KiB L1 cache /0/a7 memory 32KiB L1 cache /0/aa/ab memory 18MiB L3 cache /0/aa/ad memory 256KiB L2 cache /0/aa/ae memory 32KiB L1 cache /0/ac memory 32KiB L1 cache /0/af/b0 memory 18MiB L3 cache /0/af/b2 memory 256KiB L2 cache /0/af/b3 memory 32KiB L1 cache /0/b1 memory 32KiB L1 cache /0/b4/b5 memory 18MiB L3 cache /0/b4/b7 memory 256KiB L2 cache /0/b4/b8 memory 32KiB L1 cache /0/b6 memory 32KiB L1 cache /0/b9/ba memory 18MiB L3 cache /0/b9/bc memory 256KiB L2 cache /0/b9/bd memory 32KiB L1 cache /0/bb memory 32KiB L1 cache
Comando dmidecode
Este comando es algo especial, ya que obtiene la información directamente del DMI (Direct Media Interface), que no es más que un enlace entre el dos puntos clave en una placa base: el northbridge (elemento de enlace entre CPU, RAM y PCI-Express) y el southbridge (enlace entre BIOS, PCI y dispositivos de entrada/salida).
Como a dmidecode podríamos dedicar una entrada completa del blog, vamos a limitarnos a cómo obtener información de la memoria. Este comando si lo ejecutamos tal cual, muestra toda la información por pantalla, pero si queremos ser específicos podemos solicitarlo:
[root@machine ~]# dmidecode -t memory
De esta forma obtendríamos una salida detallada con la información que dmidecode es capaz de obtener de nuestra memoria, indicando información curiosa como la ubicación de cada módulo, fabricante, tipo de memoria, velocidad, número de serie, capacidad máxima del sistema, etc. Por ejemplo, en la máquina con 12 GB de RAM de antes:
[root@machine ~]# dmidecode -t memory # dmidecode 2.11 SMBIOS 2.6 present. Handle 0x002E, DMI type 16, 15 bytes Physical Memory Array Location: System Board Or Motherboard Use: System Memory Error Correction Type: Multi-bit ECC Maximum Capacity: 96 GB Error Information Handle: Not Provided Number Of Devices: 9 Handle 0x0030, DMI type 17, 28 bytes Memory Device Array Handle: 0x002E Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 2048 MB Form Factor: DIMM Set: None Locator: P1_DIMM1A Bank Locator: P1_BANK1 Type: Other Type Detail: Other Speed: 1066 MHz Manufacturer: Hyundai Serial Number: 123456789 Asset Tag: AssetTagNum0 Part Number: CETACIEMAT-123 Rank: Unknown Handle 0x0032, DMI type 17, 28 bytes Memory Device Array Handle: 0x002E Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: None Locator: P1_DIMM1B Bank Locator: P1_BANK1 Type: Other Type Detail: Other Speed: Unknown Manufacturer: Manufacturer01 Serial Number: SerNum01 Asset Tag: AssetTagNum1 Part Number: ModulePartNumber01 Rank: Unknown Handle 0x0034, DMI type 17, 28 bytes Memory Device Array Handle: 0x002E Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: None Locator: P1_DIMM1C Bank Locator: P1_BANK1 Type: Other Type Detail: Other Speed: Unknown Manufacturer: Manufacturer02 Serial Number: SerNum02 Asset Tag: AssetTagNum2 Part Number: ModulePartNumber02 Rank: Unknown Handle 0x0036, DMI type 17, 28 bytes Memory Device Array Handle: 0x002E Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 2048 MB Form Factor: DIMM Set: None Locator: P1_DIMM2A Bank Locator: P1_BANK2 Type: Other Type Detail: Other Speed: 1066 MHz Manufacturer: Hyundai Serial Number: 123456789 Asset Tag: AssetTagNum0 Part Number: CETACIEMAT-123 Rank: Unknown Handle 0x0038, DMI type 17, 28 bytes Memory Device Array Handle: 0x002E Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: None Locator: P1_DIMM2B Bank Locator: P1_BANK2 Type: Other Type Detail: Other Speed: Unknown Manufacturer: Manufacturer04 Serial Number: SerNum04 Asset Tag: AssetTagNum4 Part Number: ModulePartNumber04 Rank: Unknown Handle 0x003A, DMI type 17, 28 bytes Memory Device Array Handle: 0x002E Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: None Locator: P1_DIMM2C Bank Locator: P1_BANK2 Type: Other Type Detail: Other Speed: Unknown Manufacturer: Manufacturer05 Serial Number: SerNum05 Asset Tag: AssetTagNum5 Part Number: ModulePartNumber05 Rank: Unknown Handle 0x003C, DMI type 17, 28 bytes Memory Device Array Handle: 0x002E Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 2048 MB Form Factor: DIMM Set: None Locator: P1_DIMM3A Bank Locator: P1_BANK3 Type: Other Type Detail: Other Speed: 1066 MHz Manufacturer: Hyundai Serial Number: 123456789 Asset Tag: AssetTagNum0 Part Number: CETACIEMAT-123 Rank: Unknown Handle 0x003E, DMI type 17, 28 bytes Memory Device Array Handle: 0x002E Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: None Locator: P1_DIMM3B Bank Locator: P1_BANK3 Type: Other Type Detail: Other Speed: Unknown Manufacturer: Manufacturer07 Serial Number: SerNum07 Asset Tag: AssetTagNum7 Part Number: ModulePartNumber07 Rank: Unknown Handle 0x0040, DMI type 17, 28 bytes Memory Device Array Handle: 0x002E Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: None Locator: P1_DIMM3C Bank Locator: P1_BANK3 Type: Other Type Detail: Other Speed: Unknown Manufacturer: Manufacturer08 Serial Number: SerNum08 Asset Tag: AssetTagNum8 Part Number: ModulePartNumber08 Rank: Unknown Handle 0x0042, DMI type 16, 15 bytes Physical Memory Array Location: System Board Or Motherboard Use: System Memory Error Correction Type: Multi-bit ECC Maximum Capacity: 96 GB Error Information Handle: Not Provided Number Of Devices: 9 Handle 0x0044, DMI type 17, 28 bytes Memory Device Array Handle: 0x0042 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 2048 MB Form Factor: DIMM Set: None Locator: P2_DIMM1A Bank Locator: P2_BANK1 Type: Other Type Detail: Other Speed: 1066 MHz Manufacturer: Hyundai Serial Number: 123456789 Asset Tag: AssetTagNum0 Part Number: CETACIEMAT-123 Rank: Unknown Handle 0x0046, DMI type 17, 28 bytes Memory Device Array Handle: 0x0042 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: None Locator: P2_DIMM1B Bank Locator: P2_BANK1 Type: Other Type Detail: Other Speed: Unknown Manufacturer: Manufacturer10 Serial Number: SerNum10 Asset Tag: AssetTagNum10 Part Number: ModulePartNumber10 Rank: Unknown Handle 0x0048, DMI type 17, 28 bytes Memory Device Array Handle: 0x0042 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: None Locator: P2_DIMM1C Bank Locator: P2_BANK1 Type: Other Type Detail: Other Speed: Unknown Manufacturer: Manufacturer11 Serial Number: SerNum11 Asset Tag: AssetTagNum11 Part Number: ModulePartNumber11 Rank: Unknown Handle 0x004A, DMI type 17, 28 bytes Memory Device Array Handle: 0x0042 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 2048 MB Form Factor: DIMM Set: None Locator: P2_DIMM2A Bank Locator: P2_BANK2 Type: Other Type Detail: Other Speed: 1066 MHz Manufacturer: Hyundai Serial Number: 123456789 Asset Tag: AssetTagNum0 Part Number: CETACIEMAT-123 Rank: Unknown Handle 0x004C, DMI type 17, 28 bytes Memory Device Array Handle: 0x0042 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: None Locator: P2_DIMM2B Bank Locator: P2_BANK2 Type: Other Type Detail: Other Speed: Unknown Manufacturer: Manufacturer13 Serial Number: SerNum13 Asset Tag: AssetTagNum13 Part Number: ModulePartNumber13 Rank: Unknown Handle 0x004E, DMI type 17, 28 bytes Memory Device Array Handle: 0x0042 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: None Locator: P2_DIMM2C Bank Locator: P2_BANK2 Type: Other Type Detail: Other Speed: Unknown Manufacturer: Manufacturer14 Serial Number: SerNum14 Asset Tag: AssetTagNum14 Part Number: ModulePartNumber14 Rank: Unknown Handle 0x0050, DMI type 17, 28 bytes Memory Device Array Handle: 0x0042 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 2048 MB Form Factor: DIMM Set: None Locator: P2_DIMM3A Bank Locator: P2_BANK3 Type: Other Type Detail: Other Speed: 1066 MHz Manufacturer: Hyundai Serial Number: 123456789 Asset Tag: AssetTagNum0 Part Number: CETACIEMAT-123 Rank: Unknown Handle 0x0052, DMI type 17, 28 bytes Memory Device Array Handle: 0x0042 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: None Locator: P2_DIMM3B Bank Locator: P2_BANK3 Type: Other Type Detail: Other Speed: Unknown Manufacturer: Manufacturer16 Serial Number: SerNum16 Asset Tag: AssetTagNum16 Part Number: ModulePartNumber16 Rank: Unknown Handle 0x0054, DMI type 17, 28 bytes Memory Device Array Handle: 0x0042 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: None Locator: P2_DIMM3C Bank Locator: P2_BANK3 Type: Other Type Detail: Other Speed: Unknown Manufacturer: Manufacturer17 Serial Number: SerNum17 Asset Tag: AssetTagNum17 Part Number: ModulePartNumber17 Rank: Unknown Handle 0x0056, DMI type 16, 15 bytes Physical Memory Array Location: System Board Or Motherboard Use: Flash Memory Error Correction Type: None Maximum Capacity: 4 MB Error Information Handle: Not Provided Number Of Devices: 1 Handle 0x0058, DMI type 17, 28 bytes Memory Device Array Handle: 0x0056 Error Information Handle: Not Provided Total Width: 8 bits Data Width: 8 bits Size: 4096 kB Form Factor: Other Set: None Locator: BIOS Bank Locator: ROM0 Type: Flash Type Detail: Non-Volatile Speed: 33 MHz Manufacturer: ATMEL Serial Number: 123456789 Asset Tag: AssetTagNum0 Part Number: CETACIEMAT-123 Rank: Unknown
Herramienta hwloc
Y dejamos para el final toda una joya: hwloc. Este conjunto de herramientas soporta infinidad de posibilidades para conocer el hardware de una máquina, hasta el punto de ser capaz de mostrar la topología hardware de la máquina. Una vez que se instala esta herramienta, tendremos acceso a una serie de comandos muy útiles en el sistema, como puede ser lstopo. Ejecutándolo «a secas», la salida directa de este comando es la siguiente (para la máquina de 1 TB de RAM):
[root@supernode ~]# lstopo --whole-system Machine (1024GB total) Group0 L#0 NUMANode L#0 (P#0 128GB) + Socket L#0 + L3 L#0 (18MB) L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0 + PU L#0 (P#0) L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1 + PU L#1 (P#8) L2 L#2 (256KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2 + PU L#2 (P#16) L2 L#3 (256KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3 + PU L#3 (P#24) L2 L#4 (256KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4 + PU L#4 (P#32) L2 L#5 (256KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5 + PU L#5 (P#40) L2 L#6 (256KB) + L1d L#6 (32KB) + L1i L#6 (32KB) + Core L#6 + PU L#6 (P#48) L2 L#7 (256KB) + L1d L#7 (32KB) + L1i L#7 (32KB) + Core L#7 + PU L#7 (P#56) NUMANode L#1 (P#1 128GB) + Socket L#1 + L3 L#1 (18MB) L2 L#8 (256KB) + L1d L#8 (32KB) + L1i L#8 (32KB) + Core L#8 + PU L#8 (P#1) L2 L#9 (256KB) + L1d L#9 (32KB) + L1i L#9 (32KB) + Core L#9 + PU L#9 (P#9) L2 L#10 (256KB) + L1d L#10 (32KB) + L1i L#10 (32KB) + Core L#10 + PU L#10 (P#17) L2 L#11 (256KB) + L1d L#11 (32KB) + L1i L#11 (32KB) + Core L#11 + PU L#11 (P#25) L2 L#12 (256KB) + L1d L#12 (32KB) + L1i L#12 (32KB) + Core L#12 + PU L#12 (P#33) L2 L#13 (256KB) + L1d L#13 (32KB) + L1i L#13 (32KB) + Core L#13 + PU L#13 (P#41) L2 L#14 (256KB) + L1d L#14 (32KB) + L1i L#14 (32KB) + Core L#14 + PU L#14 (P#49) L2 L#15 (256KB) + L1d L#15 (32KB) + L1i L#15 (32KB) + Core L#15 + PU L#15 (P#57) NUMANode L#2 (P#2 128GB) + Socket L#2 + L3 L#2 (18MB) L2 L#16 (256KB) + L1d L#16 (32KB) + L1i L#16 (32KB) + Core L#16 + PU L#16 (P#2) L2 L#17 (256KB) + L1d L#17 (32KB) + L1i L#17 (32KB) + Core L#17 + PU L#17 (P#10) L2 L#18 (256KB) + L1d L#18 (32KB) + L1i L#18 (32KB) + Core L#18 + PU L#18 (P#18) L2 L#19 (256KB) + L1d L#19 (32KB) + L1i L#19 (32KB) + Core L#19 + PU L#19 (P#26) L2 L#20 (256KB) + L1d L#20 (32KB) + L1i L#20 (32KB) + Core L#20 + PU L#20 (P#34) L2 L#21 (256KB) + L1d L#21 (32KB) + L1i L#21 (32KB) + Core L#21 + PU L#21 (P#42) L2 L#22 (256KB) + L1d L#22 (32KB) + L1i L#22 (32KB) + Core L#22 + PU L#22 (P#50) L2 L#23 (256KB) + L1d L#23 (32KB) + L1i L#23 (32KB) + Core L#23 + PU L#23 (P#58) NUMANode L#3 (P#3 128GB) + Socket L#3 + L3 L#3 (18MB) L2 L#24 (256KB) + L1d L#24 (32KB) + L1i L#24 (32KB) + Core L#24 + PU L#24 (P#3) L2 L#25 (256KB) + L1d L#25 (32KB) + L1i L#25 (32KB) + Core L#25 + PU L#25 (P#11) L2 L#26 (256KB) + L1d L#26 (32KB) + L1i L#26 (32KB) + Core L#26 + PU L#26 (P#19) L2 L#27 (256KB) + L1d L#27 (32KB) + L1i L#27 (32KB) + Core L#27 + PU L#27 (P#27) L2 L#28 (256KB) + L1d L#28 (32KB) + L1i L#28 (32KB) + Core L#28 + PU L#28 (P#35) L2 L#29 (256KB) + L1d L#29 (32KB) + L1i L#29 (32KB) + Core L#29 + PU L#29 (P#43) L2 L#30 (256KB) + L1d L#30 (32KB) + L1i L#30 (32KB) + Core L#30 + PU L#30 (P#51) L2 L#31 (256KB) + L1d L#31 (32KB) + L1i L#31 (32KB) + Core L#31 + PU L#31 (P#59) Group0 L#1 NUMANode L#4 (P#4 128GB) + Socket L#4 + L3 L#4 (18MB) L2 L#32 (256KB) + L1d L#32 (32KB) + L1i L#32 (32KB) + Core L#32 + PU L#32 (P#4) L2 L#33 (256KB) + L1d L#33 (32KB) + L1i L#33 (32KB) + Core L#33 + PU L#33 (P#12) L2 L#34 (256KB) + L1d L#34 (32KB) + L1i L#34 (32KB) + Core L#34 + PU L#34 (P#20) L2 L#35 (256KB) + L1d L#35 (32KB) + L1i L#35 (32KB) + Core L#35 + PU L#35 (P#28) L2 L#36 (256KB) + L1d L#36 (32KB) + L1i L#36 (32KB) + Core L#36 + PU L#36 (P#36) L2 L#37 (256KB) + L1d L#37 (32KB) + L1i L#37 (32KB) + Core L#37 + PU L#37 (P#44) L2 L#38 (256KB) + L1d L#38 (32KB) + L1i L#38 (32KB) + Core L#38 + PU L#38 (P#52) L2 L#39 (256KB) + L1d L#39 (32KB) + L1i L#39 (32KB) + Core L#39 + PU L#39 (P#60) NUMANode L#5 (P#5 128GB) + Socket L#5 + L3 L#5 (18MB) L2 L#40 (256KB) + L1d L#40 (32KB) + L1i L#40 (32KB) + Core L#40 + PU L#40 (P#5) L2 L#41 (256KB) + L1d L#41 (32KB) + L1i L#41 (32KB) + Core L#41 + PU L#41 (P#13) L2 L#42 (256KB) + L1d L#42 (32KB) + L1i L#42 (32KB) + Core L#42 + PU L#42 (P#21) L2 L#43 (256KB) + L1d L#43 (32KB) + L1i L#43 (32KB) + Core L#43 + PU L#43 (P#29) L2 L#44 (256KB) + L1d L#44 (32KB) + L1i L#44 (32KB) + Core L#44 + PU L#44 (P#37) L2 L#45 (256KB) + L1d L#45 (32KB) + L1i L#45 (32KB) + Core L#45 + PU L#45 (P#45) L2 L#46 (256KB) + L1d L#46 (32KB) + L1i L#46 (32KB) + Core L#46 + PU L#46 (P#53) L2 L#47 (256KB) + L1d L#47 (32KB) + L1i L#47 (32KB) + Core L#47 + PU L#47 (P#61) NUMANode L#6 (P#6 128GB) + Socket L#6 + L3 L#6 (18MB) L2 L#48 (256KB) + L1d L#48 (32KB) + L1i L#48 (32KB) + Core L#48 + PU L#48 (P#6) L2 L#49 (256KB) + L1d L#49 (32KB) + L1i L#49 (32KB) + Core L#49 + PU L#49 (P#14) L2 L#50 (256KB) + L1d L#50 (32KB) + L1i L#50 (32KB) + Core L#50 + PU L#50 (P#22) L2 L#51 (256KB) + L1d L#51 (32KB) + L1i L#51 (32KB) + Core L#51 + PU L#51 (P#30) L2 L#52 (256KB) + L1d L#52 (32KB) + L1i L#52 (32KB) + Core L#52 + PU L#52 (P#38) L2 L#53 (256KB) + L1d L#53 (32KB) + L1i L#53 (32KB) + Core L#53 + PU L#53 (P#46) L2 L#54 (256KB) + L1d L#54 (32KB) + L1i L#54 (32KB) + Core L#54 + PU L#54 (P#54) L2 L#55 (256KB) + L1d L#55 (32KB) + L1i L#55 (32KB) + Core L#55 + PU L#55 (P#62) NUMANode L#7 (P#7 128GB) + Socket L#7 + L3 L#7 (18MB) L2 L#56 (256KB) + L1d L#56 (32KB) + L1i L#56 (32KB) + Core L#56 + PU L#56 (P#7) L2 L#57 (256KB) + L1d L#57 (32KB) + L1i L#57 (32KB) + Core L#57 + PU L#57 (P#15) L2 L#58 (256KB) + L1d L#58 (32KB) + L1i L#58 (32KB) + Core L#58 + PU L#58 (P#23) L2 L#59 (256KB) + L1d L#59 (32KB) + L1i L#59 (32KB) + Core L#59 + PU L#59 (P#31) L2 L#60 (256KB) + L1d L#60 (32KB) + L1i L#60 (32KB) + Core L#60 + PU L#60 (P#39) L2 L#61 (256KB) + L1d L#61 (32KB) + L1i L#61 (32KB) + Core L#61 + PU L#61 (P#47) L2 L#62 (256KB) + L1d L#62 (32KB) + L1i L#62 (32KB) + Core L#62 + PU L#62 (P#55) L2 L#63 (256KB) + L1d L#63 (32KB) + L1i L#63 (32KB) + Core L#63 + PU L#63 (P#63) HostBridge L#0 PCIBridge PCI 8086:10c9 Net L#0 "eth0" PCI 8086:10c9 Net L#1 "eth1" PCIBridge PCI 1000:0079 Block L#2 "sda" PCIBridge PCI 102b:0532 PCI 8086:3a22 Block L#3 "sr0" HostBridge L#4 PCIBridge PCI 8086:10c9 Net L#4 "eth2" PCI 8086:10c9 Net L#5 "eth3" HostBridge L#6 PCIBridge PCI 1000:0079 Block L#6 "sdb" PCIBridge PCI 15b3:673c Net L#7 "ib0" OpenFabrics L#8 "mlx4_0"
Pero lo mejor es que… ¡podemos mostrar de forma gráfica esta información! De forma resumida (ya que al igual que con dmidecode podríamos dedicar otro post íntegro a hwloc) podríamos simplemente hacerlo de la siguiente forma:
[root@supernode ~]# lstopo supernode.pdf
Obteniendo la siguiente maravilla:
Podríamos simplemente indicar otra extensión entre las soportadas (FIG, PDF, PNG, XML, SVG, PS y TXT) y lo tendríamos en ese formato. Rápido, fácil y útil, ¿verdad? 😉
Otros comandos clásicos: top y htop
Por último, existen otros comandos más ampliamente conocidos y que no podemos olvidar, como son top y htop, que también nos darán de una forma más interactiva bastantes más datos.
top es una versión interactiva del comando ps (ya dedicaremos algún artículo a gestión de procesos más adelante :)). Mostrará una lista de tareas interactiva, con alguna información genérica de la máquina. Por ejemplo, esta sería la salida del comando top de la máquina de cómputo con 1 TB de RAM, en uso por parte de dos usuarios:
Tasks: 1900 total, 328 running, 1539 sleeping, 0 stopped, 33 zombie Cpu(s): 2.8%us, 0.4%sy, 0.0%ni, 96.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1058702220k total, 495625064k used, 563077156k free, 359324k buffers Swap: 2097144k total, 0k used, 2097144k free, 104963792k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 57001 cetauser1 20 0 300g 299g 2108 R 99.8 29.7 364:58.81 perl 865 root 39 19 0 0 0 S 2.9 0.0 1822:24 kipmi0 5689 root 20 0 14504 2620 880 R 2.3 0.0 0:00.33 top 4089 cetauser2 20 0 391m 191m 1724 R 0.6 0.0 0:01.08 R 4616 cetauser2 20 0 402m 201m 1656 R 0.6 0.0 0:00.77 R 4641 cetauser2 20 0 391m 191m 1724 R 0.6 0.0 0:00.72 R 4645 cetauser2 20 0 422m 221m 1652 R 0.6 0.0 0:00.70 R 5120 cetauser2 20 0 387m 187m 1724 R 0.6 0.0 0:00.50 R 5210 cetauser2 20 0 401m 200m 1724 R 0.6 0.0 0:00.47 R 5267 cetauser2 20 0 387m 187m 1724 R 0.6 0.0 0:00.44 R 5290 cetauser2 20 0 387m 187m 1724 R 0.6 0.0 0:00.43 R 5300 cetauser2 20 0 397m 196m 1620 R 0.6 0.0 0:00.37 R 5332 cetauser2 20 0 393m 192m 1528 R 0.6 0.0 0:00.32 R 5480 cetauser2 20 0 393m 192m 1592 R 0.6 0.0 0:00.22 R 5498 cetauser2 20 0 396m 195m 1592 R 0.6 0.0 0:00.17 R 5504 cetauser2 20 0 419m 218m 1528 R 0.6 0.0 0:00.15 R 5507 cetauser2 20 0 419m 218m 1528 R 0.6 0.0 0:00.14 R 5590 cetauser2 20 0 419m 218m 1528 R 0.6 0.0 0:00.12 R 5591 cetauser2 20 0 393m 192m 1580 R 0.6 0.0 0:00.12 R 5601 cetauser2 20 0 419m 218m 1528 R 0.6 0.0 0:00.12 R 5642 cetauser2 20 0 396m 195m 1512 R 0.6 0.0 0:00.10 R 5684 cetauser2 20 0 396m 195m 1324 R 0.6 0.0 0:00.03 R 5686 cetauser2 20 0 396m 195m 1300 R 0.6 0.0 0:00.02 R 5688 cetauser2 20 0 419m 218m 1260 R 0.6 0.0 0:00.02 R 51662 cetauser2 20 0 391m 192m 3000 R 0.6 0.0 5:19.37 R 3838 cetauser2 20 0 418m 218m 1832 R 0.3 0.0 0:01.20 R 3851 cetauser2 20 0 418m 218m 1836 R 0.3 0.0 0:01.19 R 3854 cetauser2 20 0 397m 196m 1844 R 0.3 0.0 0:01.18 R 3858 cetauser2 20 0 418m 218m 1836 R 0.3 0.0 0:01.18 R 3861 cetauser2 20 0 418m 218m 1836 R 0.3 0.0 0:01.17 R 3871 cetauser2 20 0 0 0 0 R 0.3 0.0 0:01.17 R 3879 cetauser2 20 0 418m 218m 1832 R 0.3 0.0 0:01.16 R 3890 cetauser2 20 0 0 0 0 R 0.3 0.0 0:01.14 R 3901 cetauser2 20 0 391m 191m 1728 R 0.3 0.0 0:01.13 R 3906 cetauser2 20 0 0 0 0 R 0.3 0.0 0:01.12 R 3907 cetauser2 20 0 392m 191m 1732 R 0.3 0.0 0:01.12 R 3992 cetauser2 20 0 391m 191m 1748 R 0.3 0.0 0:01.12 R 3993 cetauser2 20 0 392m 191m 1732 R 0.3 0.0 0:01.12 R 3997 cetauser2 20 0 391m 191m 1728 R 0.3 0.0 0:01.11 R 3998 cetauser2 20 0 418m 218m 1732 R 0.3 0.0 0:01.12 R 4000 cetauser2 20 0 0 0 0 R 0.3 0.0 0:01.11 R 4004 cetauser2 20 0 391m 191m 1728 R 0.3 0.0 0:01.11 R 4066 cetauser2 20 0 392m 191m 1728 R 0.3 0.0 0:01.10 R 4069 cetauser2 20 0 391m 191m 1724 R 0.3 0.0 0:01.10 R 4070 cetauser2 20 0 418m 218m 1732 R 0.3 0.0 0:01.10 R 4072 cetauser2 20 0 391m 191m 1724 R 0.3 0.0 0:01.09 R 4088 cetauser2 20 0 392m 191m 1728 R 0.3 0.0 0:01.08 R 4091 cetauser2 20 0 418m 218m 1760 R 0.3 0.0 0:01.07 R 4095 cetauser2 20 0 418m 218m 1800 R 0.3 0.0 0:01.08 R 4097 cetauser2 20 0 391m 191m 1724 R 0.3 0.0 0:01.07 R 4126 cetauser2 20 0 391m 191m 1724 R 0.3 0.0 0:01.06 R 4127 cetauser2 20 0 392m 191m 1728 R 0.3 0.0 0:01.07 R
Y para finalizar, htop es algo así como la versión fashion de top, con funcionalidades añadidas para facilitar la gestión de procesos. Su salida gráfica interactiva se muestra en la siguiente imagen (difuminando la información sensible):