Table des matières

Version : 2022.01

Updated: 2022/06/05 17:55

LCE511 - Managing Integrated Peripherals

Contents

Special Files

In a PC, peripherals are connected to a controler which communicates with the processor via a bus. The controller and associated peripherals require specific drivers. Under Linux, these drivers are normally supplied as kernel modules. Each peripheral is represented by a special file in the /dev directory. Each special file contains the information required by the system in order for it to use the driver.

Peripherals that require the system to be halted prior to plugging or unplugging them are refered to as Cold Plug Devices. Peripherals that can be plugged/unplugged whilst the system is running are refered to as Hot Plug Devices.

The following output shows the typical content of the /dev directory:

[root@centos8 ~]# ls -l /dev | more
total 0
crw-r--r--.  1 root root     10, 235 Jun 28 02:04 autofs
drwxr-xr-x.  2 root root         180 Jun 28 02:04 block
drwxr-xr-x.  2 root root         100 Jun 28 02:04 bsg
drwxr-xr-x.  3 root root          60 Jun 28 02:04 bus
lrwxrwxrwx.  1 root root           3 Jun 28 02:04 cdrom -> sr0
drwxr-xr-x.  2 root root        2940 Jun 28 02:04 char
drwxr-xr-x.  2 root root          80 Jun 28 02:04 cl_centos8
crw-------.  1 root root      5,   1 Jun 28 02:04 console
lrwxrwxrwx.  1 root root          11 Jun 28 02:04 core -> /proc/kcore
drwxr-xr-x. 10 root root         200 Jun 28 02:04 cpu
crw-------.  1 root root     10,  62 Jun 28 02:04 cpu_dma_latency
drwxr-xr-x.  6 root root         120 Jun 28 02:04 disk
brw-rw----.  1 root disk    253,   0 Jun 28 02:04 dm-0
brw-rw----.  1 root disk    253,   1 Jun 28 02:04 dm-1
drwxr-xr-x.  3 root root          80 Jun 28 02:04 dri
crw-rw----.  1 root video    29,   0 Jun 28 02:04 fb0
lrwxrwxrwx.  1 root root          13 Jun 28 02:04 fd -> /proc/self/fd
crw-rw-rw-.  1 root root      1,   7 Jun 28 02:04 full
crw-rw-rw-.  1 root root     10, 229 Jun 28 02:04 fuse
crw-------.  1 root root    245,   0 Jun 28 02:04 hidraw0
crw-------.  1 root root     10, 228 Jun 28 02:04 hpet
drwxr-xr-x.  3 root root           0 Jun 28 02:04 hugepages
crw-------.  1 root root     10, 183 Jun 28 02:04 hwrng
lrwxrwxrwx.  1 root root          12 Jun 28 02:04 initctl -> /run/initctl
drwxr-xr-x.  4 root root         280 Jun 28 02:04 input
crw-r--r--.  1 root root      1,  11 Jun 28 02:04 kmsg
lrwxrwxrwx.  1 root root          28 Jun 28 02:04 log -> /run/systemd/journal/dev-log
crw-rw----.  1 root disk     10, 237 Jun 28 02:04 loop-control
crw-rw----.  1 root lp        6,   0 Jun 28 02:04 lp0
crw-rw----.  1 root lp        6,   1 Jun 28 02:04 lp1
crw-rw----.  1 root lp        6,   2 Jun 28 02:04 lp2
crw-rw----.  1 root lp        6,   3 Jun 28 02:04 lp3
drwxr-xr-x.  2 root root         100 Jun 28 02:04 mapper
crw-------.  1 root root     10, 227 Jun 28 02:04 mcelog
crw-r-----.  1 root kmem      1,   1 Jun 28 02:04 mem
drwxrwxrwt.  2 root root          40 Jun 28 02:04 mqueue
drwxr-xr-x.  2 root root          60 Jun 28 02:04 net
crw-rw-rw-.  1 root root      1,   3 Jun 28 02:04 null
--More--

As you can see, certain files refer to block devices whilst others refer to character devices:

...
brw-rw----.  1 root disk      8,   1 Jun 28 02:04 sda1
...
crw-rw-rw-.  1 root tty       5,   0 Jun 28 02:04 tty
...

The major difference between these two types lies in the way that the communication between the system and the peripheral takes place. In the case of a block file, that communication uses a buffer whilst in the case of a character file the communication takes place directly byte by byte.

The figures that can be seen immediately before the date of the special file are called respectively the major and the minor :

LAB #1 - Commands

1.1 - The lspci Command

This command show a list of the peripherals connected to the PCI, AGP and PCI express buses:

[root@centos8 ~]# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01)
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
00:02.0 VGA compatible controller: Device 1234:1111 (rev 02)
00:03.0 Unclassified device [00ff]: Red Hat, Inc. Virtio memory balloon
00:07.0 SATA controller: Intel Corporation 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA Controller [AHCI mode] (rev 02)
00:12.0 Ethernet controller: Red Hat, Inc. Virtio network device
00:1e.0 PCI bridge: Red Hat, Inc. QEMU PCI-PCI bridge
00:1f.0 PCI bridge: Red Hat, Inc. QEMU PCI-PCI bridge

To obtain peripheral specific information, use the -v or -vv switches whilst specifying the peripheral ID:

[root@centos8 ~]# lspci -v -s 00:03.0
00:03.0 Unclassified device [00ff]: Red Hat, Inc. Virtio memory balloon
        Subsystem: Red Hat, Inc. Device 0005
        Physical Slot: 3
        Flags: bus master, fast devsel, latency 0, IRQ 10
        I/O ports at e000 [size=64]
        Memory at fe400000 (64-bit, prefetchable) [size=16K]
        Capabilities: [84] Vendor Specific Information: VirtIO: <unknown>
        Capabilities: [70] Vendor Specific Information: VirtIO: Notify
        Capabilities: [60] Vendor Specific Information: VirtIO: DeviceCfg
        Capabilities: [50] Vendor Specific Information: VirtIO: ISR
        Capabilities: [40] Vendor Specific Information: VirtIO: CommonCfg
        Kernel driver in use: virtio-pci
[root@centos8 ~]# lspci -vv -s 00:03.0
00:03.0 Unclassified device [00ff]: Red Hat, Inc. Virtio memory balloon
        Subsystem: Red Hat, Inc. Device 0005
        Physical Slot: 3
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 0
        Interrupt: pin A routed to IRQ 10
        Region 0: I/O ports at e000 [size=64]
        Region 4: Memory at fe400000 (64-bit, prefetchable) [size=16K]
        Capabilities: [84] Vendor Specific Information: VirtIO: <unknown>
                BAR=0 offset=00000000 size=00000000
        Capabilities: [70] Vendor Specific Information: VirtIO: Notify
                BAR=4 offset=00003000 size=00001000 multiplier=00000004
        Capabilities: [60] Vendor Specific Information: VirtIO: DeviceCfg
                BAR=4 offset=00002000 size=00001000
        Capabilities: [50] Vendor Specific Information: VirtIO: ISR
                BAR=4 offset=00001000 size=00001000
        Capabilities: [40] Vendor Specific Information: VirtIO: CommonCfg
                BAR=4 offset=00000000 size=00001000
        Kernel driver in use: virtio-pci

Command Line Switches

The command line switches of this command are:

[root@centos8 ~]# lspci --help
lspci: invalid option -- '-'
Usage: lspci [<switches>]

Basic display modes:
-mm             Produce machine-readable output (single -m for an obsolete format)
-t              Show bus tree

Display options:
-v              Be verbose (-vv or -vvv for higher verbosity)
-k              Show kernel drivers handling each device
-x              Show hex-dump of the standard part of the config space
-xxx            Show hex-dump of the whole config space (dangerous; root only)
-xxxx           Show hex-dump of the 4096-byte extended config space (root only)
-b              Bus-centric view (addresses and IRQ's as seen by the bus)
-D              Always show domain numbers
-P              Display bridge path in addition to bus and device number
-PP             Display bus path in addition to bus and device number

Resolving of device ID's to names:
-n              Show numeric ID's
-nn             Show both textual and numeric ID's (names & numbers)
-q              Query the PCI ID database for unknown ID's via DNS
-qq             As above, but re-query locally cached entries
-Q              Query the PCI ID database for all ID's via DNS

Selection of devices:
-s [[[[<domain>]:]<bus>]:][<slot>][.[<func>]]   Show only devices in selected slots
-d [<vendor>]:[<device>][:<class>]              Show only devices with specified ID's

Other options:
-i <file>       Use specified ID database instead of /usr/share/hwdata/pci.ids
-p <file>       Look up kernel modules in a given file instead of default modules.pcimap
-M              Enable `bus 

1.2 - The lsusb Command

This command show a list of the peripherals connected to the USB bus:

[root@centos8 ~]# lsusb
Bus 001 Device 002: ID 0627:0001 Adomax Technology Co., Ltd 
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

[root@centos8 ~]# lsusb -vt
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
    |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M

Command Line Switches

The command line switches of this command are:

[root@centos8 ~]# lsusb --help
Usage: lsusb [options]...
List USB devices
  -v, --verbose
      Increase verbosity (show descriptors)
  -s [[bus]:][devnum]
      Show only devices with specified device and/or
      bus numbers (in decimal)
  -d vendor:[product]
      Show only devices with the specified vendor and
      product ID numbers (in hexadecimal)
		.LAB#1
  -D device
      Selects which device lsusb will examine
  -t, --tree
      Dump the physical USB device hierarchy as a tree
  -V, --version
      Show version of program
  -h, --help
      Show usage and help

1.3 - The dmidecode Command

The dmidecode Command reads the DMI (Desktop Management Interface) table, also called the SMBIOS (System Management BIOS) and provides information on:

[root@centos8 ~]# dmidecode
# dmidecode 3.2
Getting SMBIOS data from sysfs.
SMBIOS 2.8 present.
11 structures occupying 511 bytes.
Table at 0x000F5870.

Handle 0x0000, DMI type 0, 24 bytes
BIOS Information
        Vendor: SeaBIOS
        Version: rel-1.14.0-0-g155821a1990b-prebuilt.qemu.org
        Release Date: 04/01/2014
        Address: 0xE8000
        Runtime Size: 96 kB
        ROM Size: 64 kB
        Characteristics:
                BIOS characteristics not supported
                Targeted content distribution is supported
        BIOS Revision: 0.0

Handle 0x0100, DMI type 1, 27 bytes
System Information
        Manufacturer: QEMU
        Product Name: Standard PC (i440FX + PIIX, 1996)
        Version: pc-i440fx-5.2
        Serial Number: Not Specified
        UUID: 95bd69e3-4a74-44a7-b58c-b74fbfb86df2
        Wake-up Type: Power Switch
        SKU Number: Not Specified
        Family: Not Specified

Handle 0x0300, DMI type 3, 22 bytes
Chassis Information
        Manufacturer: QEMU
        Type: Other
        Lock: Not Present
        Version: pc-i440fx-5.2
        Serial Number: Not Specified
        Asset Tag: Not Specified
        Boot-up State: Safe
        Power Supply State: Safe
        Thermal State: Safe
        Security Status: Unknown
        OEM Information: 0x00000000
        Height: Unspecified
        Number Of Power Cords: Unspecified
        Contained Elements: 0
        SKU Number: Not Specified

Handle 0x0400, DMI type 4, 42 bytes
Processor Information
        Socket Designation: CPU 0
        Type: Central Processor
        Family: Other
        Manufacturer: QEMU
        ID: 61 0F 00 00 FF FB 8B 07
        Version: pc-i440fx-5.2
        Voltage: Unknown
        External Clock: Unknown
        Max Speed: 2000 MHz
        Current Speed: 2000 MHz
        Status: Populated, Enabled
        Upgrade: Other
        L1 Cache Handle: Not Provided
        L2 Cache Handle: Not Provided
        L3 Cache Handle: Not Provided
        Serial Number: Not Specified
        Asset Tag: Not Specified
        Part Number: Not Specified
        Core Count: 4
        Core Enabled: 4
        Thread Count: 1
        Characteristics: None

Handle 0x0401, DMI type 4, 42 bytes
Processor Information
        Socket Designation: CPU 1
        Type: Central Processor
        Family: Other
        Manufacturer: QEMU
        ID: 61 0F 00 00 FF FB 8B 07
        Version: pc-i440fx-5.2
        Voltage: Unknown
        External Clock: Unknown
        Max Speed: 2000 MHz
        Current Speed: 2000 MHz
        Status: Populated, Enabled
        Upgrade: Other
        L1 Cache Handle: Not Provided
        L2 Cache Handle: Not Provided
        L3 Cache Handle: Not Provided
        Serial Number: Not Specified
        Asset Tag: Not Specified
        Part Number: Not Specified
        Core Count: 4
        Core Enabled: 4
        Thread Count: 1
        Characteristics: None

Handle 0x1000, DMI type 16, 23 bytes
Physical Memory Array
        Location: Other
        Use: System Memory
        Error Correction Type: Multi-bit ECC
        Maximum Capacity: 4 GB
        Error Information Handle: Not Provided
        Number Of Devices: 1

Handle 0x1100, DMI type 17, 40 bytes
Memory Device
        Array Handle: 0x1000
        Error Information Handle: Not Provided
        Total Width: Unknown
        Data Width: Unknown
        Size: 4 GB
        Form Factor: DIMM
        Set: None
        Locator: DIMM 0
        Bank Locator: Not Specified
        Type: RAM
        Type Detail: Other
        Speed: Unknown
        Manufacturer: QEMU
        Serial Number: Not Specified
        Asset Tag: Not Specified
        Part Number: Not Specified
        Rank: Unknown
        Configured Memory Speed: Unknown
        Minimum Voltage: Unknown
        Maximum Voltage: Unknown
        Configured Voltage: Unknown

Handle 0x1300, DMI type 19, 31 bytes
Memory Array Mapped Address
        Starting Address: 0x00000000000
        Ending Address: 0x000BFFFFFFF
        Range Size: 3 GB
        Physical Array Handle: 0x1000
        Partition Width: 1

Handle 0x1301, DMI type 19, 31 bytes
Memory Array Mapped Address
        Starting Address: 0x00100000000
        Ending Address: 0x0013FFFFFFF
        Range Size: 1 GB
        Physical Array Handle: 0x1000
        Partition Width: 1

Handle 0x2000, DMI type 32, 11 bytes
System Boot Information
        Status: No errors detected

Handle 0x7F00, DMI type 127, 4 bytes
End Of Table

Command Line Switches

The command line switches of this command are:

[root@centos7 ~]# dmidecode --help
Usage: dmidecode [OPTIONS]
Options are:
 -d, --dev-mem FILE     Read memory from device FILE (default: /dev/mem)
 -h, --help             Display this help text and exit
 -q, --quiet            Less verbose output
 -s, --string KEYWORD   Only display the value of the given DMI string
 -t, --type TYPE        Only display the entries of given type
 -u, --dump             Do not decode the entries
     --dump-bin FILE    Dump the DMI data to a binary file
     --from-dump FILE   Read the DMI data from a binary file
 -V, --version          Display the version and exit

LAB #2 - The sysctl Command

2.1 - The /proc Directory

The /proc directory contains virtual files and directories wich are created dynamically when consulted. Only root can consult all of the information in /proc.

[root@centos8 ~]# ls /proc
1      16391  19    2212  2427  2622  431   59    84    999          mdstat
10     16476  1931  2215  2428  2659  432   6     842   acpi         meminfo
1007   16534  1956  2222  2431  2667  433   60    8465  buddyinfo    misc
11     16576  1960  2226  2432  2686  434   61    866   bus          modules
11805  16593  2     2230  2435  27    435   63    867   cgroups      mounts
12     16598  20    2237  2439  28    436   64    868   cmdline      mtrr
1219   16600  2007  2238  244   29    437   65    869   consoles     net
1228   16613  2029  2241  2443  3     44    6568  87    cpuinfo      pagetypeinfo
1232   16646  203   2244  2445  31    446   66    870   crypto       partitions
1234   16673  2034  2247  2449  32    45    67    871   devices      sched_debug
1235   16677  2037  2260  2451  33    46    674   872   diskstats    schedstat
1247   16711  2054  2262  2465  34    47    68    874   dma          scsi
13     16712  2062  2267  2472  35    4790  69    875   driver       self
1307   16729  21    2268  2473  37    49    70    878   execdomains  slabinfo
1339   16742  210   2274  2474  38    50    701   879   fb           softirqs
1356   17     2118  2275  2475  39    5076  71    880   filesystems  stat
14     1764   2121  2280  2476  4     51    714   884   fs           swaps
1441   180    2124  2287  2478  40    52    72    887   interrupts   sys
1443   181    2126  2292  2481  402   53    73    9     iomem        sysrq-trigger
1444   1817   2156  23    2484  41    532   74    901   ioports      sysvipc
1446   182    2160  2302  25    419   539   75    903   irq          thread-self
14977  1828   2164  2307  2536  420   55    76    9144  kallsyms     timer_list
15     1829   2165  2310  2539  421   568   8     916   kcore        tty
15067  183    2167  2330  2571  422   569   808   918   keys         uptime
1536   1845   2169  2332  2578  423   570   809   919   key-users    version
1553   185    2177  2349  2579  425   571   81    921   kmsg         vmallocinfo
15594  186    2187  2358  259   426   572   833   969   kpagecgroup  vmstat
15735  187    2190  2373  2593  427   573   835   986   kpagecount   zoneinfo
16     1880   2194  2384  26    428   574   837   989   kpageflags
16165  1883   22    239   2602  43    575   838   990   loadavg
16167  1888   2204  241   2608  430   576   839   993   locks

Files

/proc/cpuinfo
[root@centos8 ~]# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 15
model           : 6
model name      : Common KVM processor
stepping        : 1
microcode       : 0x1
cpu MHz         : 1999.987
cache size      : 16384 KB
physical id     : 0
siblings        : 4
core id         : 0
cpu cores       : 4
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc nopl xtopology cpuid tsc_known_freq pni cx16 x2apic hypervisor lahf_lm cpuid_fault pti
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips        : 3999.97
clflush size    : 64
cache_alignment : 128
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 15
model           : 6
model name      : Common KVM processor
stepping        : 1
microcode       : 0x1
cpu MHz         : 1999.987
cache size      : 16384 KB
physical id     : 0
siblings        : 4
core id         : 1
cpu cores       : 4
apicid          : 1
initial apicid  : 1
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc nopl xtopology cpuid tsc_known_freq pni cx16 x2apic hypervisor lahf_lm cpuid_fault pti
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips        : 3999.97
clflush size    : 64
cache_alignment : 128
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor       : 2
vendor_id       : GenuineIntel
cpu family      : 15
model           : 6
model name      : Common KVM processor
stepping        : 1
microcode       : 0x1
cpu MHz         : 1999.987
cache size      : 16384 KB
physical id     : 0
siblings        : 4
core id         : 2
cpu cores       : 4
apicid          : 2
initial apicid  : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc nopl xtopology cpuid tsc_known_freq pni cx16 x2apic hypervisor lahf_lm cpuid_fault pti
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips        : 3999.97
clflush size    : 64
cache_alignment : 128
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor       : 3
vendor_id       : GenuineIntel
cpu family      : 15
model           : 6
model name      : Common KVM processor
stepping        : 1
microcode       : 0x1
cpu MHz         : 1999.987
cache size      : 16384 KB
physical id     : 0
siblings        : 4
core id         : 3
cpu cores       : 4
apicid          : 3
initial apicid  : 3
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc nopl xtopology cpuid tsc_known_freq pni cx16 x2apic hypervisor lahf_lm cpuid_fault pti
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips        : 3999.97
clflush size    : 64
cache_alignment : 128
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor       : 4
vendor_id       : GenuineIntel
cpu family      : 15
model           : 6
model name      : Common KVM processor
stepping        : 1
microcode       : 0x1
cpu MHz         : 1999.987
cache size      : 16384 KB
physical id     : 1
siblings        : 4
core id         : 0
cpu cores       : 4
apicid          : 4
initial apicid  : 4
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc nopl xtopology cpuid tsc_known_freq pni cx16 x2apic hypervisor lahf_lm cpuid_fault pti
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips        : 3999.97
clflush size    : 64
cache_alignment : 128
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor       : 5
vendor_id       : GenuineIntel
cpu family      : 15
model           : 6
model name      : Common KVM processor
stepping        : 1
microcode       : 0x1
cpu MHz         : 1999.987
cache size      : 16384 KB
physical id     : 1
siblings        : 4
core id         : 1
cpu cores       : 4
apicid          : 5
initial apicid  : 5
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc nopl xtopology cpuid tsc_known_freq pni cx16 x2apic hypervisor lahf_lm cpuid_fault pti
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips        : 3999.97
clflush size    : 64
cache_alignment : 128
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor       : 6
vendor_id       : GenuineIntel
cpu family      : 15
model           : 6
model name      : Common KVM processor
stepping        : 1
microcode       : 0x1
cpu MHz         : 1999.987
cache size      : 16384 KB
physical id     : 1
siblings        : 4
core id         : 2
cpu cores       : 4
apicid          : 6
initial apicid  : 6
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc nopl xtopology cpuid tsc_known_freq pni cx16 x2apic hypervisor lahf_lm cpuid_fault pti
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips        : 3999.97
clflush size    : 64
cache_alignment : 128
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor       : 7
vendor_id       : GenuineIntel
cpu family      : 15
model           : 6
model name      : Common KVM processor
stepping        : 1
microcode       : 0x1
cpu MHz         : 1999.987
cache size      : 16384 KB
physical id     : 1
siblings        : 4
core id         : 3
cpu cores       : 4
apicid          : 7
initial apicid  : 7
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc nopl xtopology cpuid tsc_known_freq pni cx16 x2apic hypervisor lahf_lm cpuid_fault pti
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips        : 3999.97
clflush size    : 64
cache_alignment : 128
address sizes   : 40 bits physical, 48 bits virtual
power management:
/proc/interrupts
[root@centos8 ~]# cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       
  0:        109          0          0          0          0          0          0          0   IO-APIC   2-edge      timer
  1:          0          0          0          0          9          0          0          0   IO-APIC   1-edge      i8042
  8:          0          0          0          0          0          1          0          0   IO-APIC   8-edge      rtc0
  9:          0          0          0          0          0          0          0          0   IO-APIC   9-fasteoi   acpi
 10:          0          0          0          0      47098          0          0          0   IO-APIC  10-fasteoi   virtio0
 11:          0          0         31          0          0          0          0          0   IO-APIC  11-fasteoi   uhci_hcd:usb1
 12:          0          0          0         15          0          0          0          0   IO-APIC  12-edge      i8042
 14:          0          0          0          0          0          0          0          0   IO-APIC  14-edge      ata_piix
 15:       7376          0        144          0          0          0          0      84588   IO-APIC  15-edge      ata_piix
 24:          0          0          0          0          0          0          0          0   PCI-MSI 294912-edge      virtio1-config
 25:          0          0          0          0          0       5640          0         16   PCI-MSI 294913-edge      virtio1-input.0
 26:         36          0          0       5058          0          0          0          0   PCI-MSI 294914-edge      virtio1-output.0
 27:          0      16008          0       9431          0          0          0          0   PCI-MSI 114688-edge      ahci[0000:00:07.0]
NMI:          0          0          0          0          0          0          0          0   Non-maskable interrupts
LOC:     870537     771900    1117711     288839     833717     502365     758229     405110   Local timer interrupts
SPU:          0          0          0          0          0          0          0          0   Spurious interrupts
PMI:          0          0          0          0          0          0          0          0   Performance monitoring interrupts
IWI:          0          0          0          0          2          0          0          0   IRQ work interrupts
RTR:          0          0          0          0          0          0          0          0   APIC ICR read retries
RES:     178171      67749      43116      65994      71361     118585      54139      53452   Rescheduling interrupts
CAL:      11095      11007      10841      10343      14679       9998      12165      12443   Function call interrupts
TLB:       2295       2297       2000       1728       2330       2338       1991       1861   TLB shootdowns
TRM:          0          0          0          0          0          0          0          0   Thermal event interrupts
THR:          0          0          0          0          0          0          0          0   Threshold APIC interrupts
DFR:          0          0          0          0          0          0          0          0   Deferred Error APIC interrupts
MCE:          0          0          0          0          0          0          0          0   Machine check exceptions
MCP:        288        288        288        288        288        288        288        288   Machine check polls
HYP:          0          0          0          0          0          0          0          0   Hypervisor callback interrupts
HRE:          0          0          0          0          0          0          0          0   Hyper-V reenlightenment interrupts
HVS:          0          0          0          0          0          0          0          0   Hyper-V stimer0 interrupts
ERR:          0
MIS:          0
PIN:          0          0          0          0          0          0          0          0   Posted-interrupt notification event
NPI:          0          0          0          0          0          0          0          0   Nested posted-interrupt event
PIW:          0          0          0          0          0          0          0          0   Posted-interrupt wakeup event

Important : The use of an IRQ by a peripheral is exclusive.

/proc/dma
[root@centos8 ~]# cat /proc/dma
 4: cascade
/proc/ioports
root@centos8 ~]# cat /proc/ioports | more
0000-0cf7 : PCI Bus 0000:00
  0000-001f : dma1
  0020-0021 : pic1
  0040-0043 : timer0
  0050-0053 : timer1
  0060-0060 : keyboard
  0064-0064 : keyboard
  0070-0077 : rtc0
  0080-008f : dma page reg
  00a0-00a1 : pic2
  00c0-00df : dma2
  00f0-00ff : fpu
  0170-0177 : 0000:00:01.1
    0170-0177 : ata_piix
  01f0-01f7 : 0000:00:01.1
    01f0-01f7 : ata_piix
  0376-0376 : 0000:00:01.1
    0376-0376 : ata_piix
  03c0-03df : vga+
  03f6-03f6 : 0000:00:01.1
    03f6-03f6 : ata_piix
--More--

Important - If two peripherals use the same IO Port, both become unusable.

/proc/devices
[root@centos8 ~]# cat /proc/devices
Character devices:
  1 mem
  4 /dev/vc/0
  4 tty
  4 ttyS
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  7 vcs
 10 misc
 13 input
 21 sg
 29 fb
128 ptm
136 pts
162 raw
180 usb
188 ttyUSB
189 usb_device
202 cpu/msr
203 cpu/cpuid
226 drm
244 aux
245 hidraw
246 usbmon
247 bsg
248 watchdog
249 ptp
250 pps
251 rtc
252 dax
253 tpm
254 gpiochip

Block devices:
  8 sd
  9 md
 11 sr
 65 sd
 66 sd
 67 sd
 68 sd
 69 sd
 70 sd
 71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
253 device-mapper
254 mdp
259 blkext
/proc/modules
[root@centos8 ~]# cat /proc/modules | more
xt_CHECKSUM 16384 1 - Live 0xffffffffc09a8000
ipt_MASQUERADE 16384 3 - Live 0xffffffffc09a3000
xt_conntrack 16384 1 - Live 0xffffffffc099e000
ipt_REJECT 16384 2 - Live 0xffffffffc0999000
nft_compat 20480 16 - Live 0xffffffffc0993000
nf_nat_tftp 16384 0 - Live 0xffffffffc098b000
nft_objref 16384 1 - Live 0xffffffffc0986000
nf_conntrack_tftp 16384 3 nf_nat_tftp, Live 0xffffffffc0981000
nft_counter 16384 33 - Live 0xffffffffc097c000
tun 53248 1 - Live 0xffffffffc096e000
bridge 192512 0 - Live 0xffffffffc093e000
stp 16384 1 bridge, Live 0xffffffffc0939000
llc 16384 2 bridge,stp, Live 0xffffffffc0930000
nft_fib_inet 16384 1 - Live 0xffffffffc08f5000
nft_fib_ipv4 16384 1 nft_fib_inet, Live 0xffffffffc08ed000
nft_fib_ipv6 16384 1 nft_fib_inet, Live 0xffffffffc08e8000
nft_fib 16384 3 nft_fib_inet,nft_fib_ipv4,nft_fib_ipv6, Live 0xffffffffc08e3000
nft_reject_inet 16384 5 - Live 0xffffffffc08de000
nf_reject_ipv4 16384 2 ipt_REJECT,nft_reject_inet, Live 0xffffffffc08d9000
nf_reject_ipv6 16384 1 nft_reject_inet, Live 0xffffffffc08d4000
nft_reject 16384 1 nft_reject_inet, Live 0xffffffffc08cf000
--More--
/proc/diskstats
[root@centos8 ~]# cat /proc/diskstats
   8       0 sda 15481 112 1445637 154103 10272 2377 277530 890611 0 237219 1044714 0 0 0 0
   8       1 sda1 402 3 66754 13349 31 18 392 4632 0 2824 17981 0 0 0 0
   8       2 sda2 14915 109 1375516 140528 8450 2359 277138 869788 0 225416 1010316 0 0 0 0
   8      16 sdb 230 0 5991 36 0 0 0 0 0 110 36 0 0 0 0
  11       0 sr0 10 0 4 2 0 0 0 0 0 9 2 0 0 0 0
 253       0 dm-0 11651 0 1364532 72138 12121 0 288727 1208138 0 227630 1280276 0 0 0 0
 253       1 dm-1 104 0 4440 79 0 0 0 0 0 71 79 0 0 0 0
/proc/partitions
[root@centos8 ~]# cat /proc/partitions
major minor  #blocks  name

   8        0   33554432 sda
   8        1    1048576 sda1
   8        2   32504832 sda2
   8       16    4194304 sdb
  11        0    1048575 sr0
 253        0   29143040 dm-0
 253        1    3358720 dm-1
/proc/swaps
[root@centos8 ~]# cat /proc/swaps
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       3358716 0       -2
/proc/loadavg
[root@centos8 ~]# cat /proc/loadavg
0.00 0.00 0.00 1/697 16936
/proc/meminfo
[root@centos8 ~]# cat /proc/meminfo
MemTotal:        3825032 kB
MemFree:         1862116 kB
MemAvailable:    2420560 kB
Buffers:            3300 kB
Cached:           750496 kB
SwapCached:            0 kB
Active:           315572 kB
Inactive:        1400260 kB
Active(anon):       1856 kB
Inactive(anon):   974728 kB
Active(file):     313716 kB
Inactive(file):   425532 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       3358716 kB
SwapFree:        3358716 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        962004 kB
Mapped:           261084 kB
Shmem:             14552 kB
KReclaimable:      46980 kB
Slab:             118396 kB
SReclaimable:      46980 kB
SUnreclaim:        71416 kB
KernelStack:       11280 kB
PageTables:        46532 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     5271232 kB
Committed_AS:    5072744 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
Percpu:             5920 kB
HardwareCorrupted:     0 kB
AnonHugePages:    546816 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      173944 kB
DirectMap2M:     4020224 kB
/proc/version
[root@centos8 ~]# cat /proc/version
Linux version 4.18.0-305.3.1.el8.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 8.4.1 20200928 (Red Hat 8.4.1-1) (GCC)) #1 SMP Tue Jun 1 16:14:33 UTC 2021

Répertoires

ide/scsi

This sub-directory contains disk capacity, disk type and disk geometry information.

acpi

This sub-directory contains information on energy management, temperatures, fan speeds and battery levels.

bus

This sub-directory contains a sub-directory for each bus.

net

This sub-directory contains information concerning the network.

sys

This sub-directory contains files used by root to configure the kernel. For instance, the following command configiresthe kernel to ignore incoming pings:

# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all [Enter]

2.2 - Using the sysctl Command

Files in the /proc/sys can be administered by using the sysctl command.

The sysctl command applies rules at system boot that are defined in the /etc/sysctl.conf file:

[root@centos8 ~]# cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

[root@centos8 ~]# ls -l /etc/sysctl.d/
total 0
lrwxrwxrwx. 1 root root 14 Mar 16 15:42 99-sysctl.conf -> ../sysctl.conf
[root@centos8 ~]# ls -l /usr/lib/sysctl.d/
total 24
-rw-r--r--. 1 root root 1810 Dec 22  2020 10-default-yama-scope.conf
-rw-r--r--. 1 root root  524 Mar 16 15:42 50-coredump.conf
-rw-r--r--. 1 root root 1270 Mar 16 15:42 50-default.conf
-rw-r--r--. 1 root root  246 Jun 15  2020 50-libkcapi-optmem_max.conf
-rw-r--r--. 1 root root  636 Mar 16 15:42 50-pid-max.conf
-rw-r--r--. 1 root root  499 Nov 26  2019 60-libvirtd.conf

[root@centos8 ~]# cat /usr/lib/sysctl.d/50-default.conf 
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

# See sysctl.d(5) and core(5) for documentation.

# To override settings in this file, create a local file in /etc
# (e.g. /etc/sysctl.d/90-override.conf), and put any assignments
# there.

# System Request functionality of the kernel (SYNC)
#
# Use kernel.sysrq = 1 to allow all keys.
# See https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html for a list
# of values and keys.
kernel.sysrq = 16

# Append the PID to the core filename
kernel.core_uses_pid = 1

# https://bugzilla.redhat.com/show_bug.cgi?id=1689346
kernel.kptr_restrict = 1

# Source route verification
net.ipv4.conf.all.rp_filter = 1

# Do not accept source routing
net.ipv4.conf.all.accept_source_route = 0

# Promote secondary addresses when the primary address is removed
net.ipv4.conf.all.promote_secondaries = 1

# Fair Queue CoDel packet scheduler to fight bufferbloat
net.core.default_qdisc = fq_codel

# Enable hard and soft link protection
fs.protected_hardlinks = 1
fs.protected_symlinks = 1

The command line switches of this command are:

Usage:
 sysctl [options] [variable[=value] ...]

Options:
  -a, --all            display all variables
  -A                   alias of -a
  -X                   alias of -a
      --deprecated     include deprecated parameters to listing
  -b, --binary         print value without new line
  -e, --ignore         ignore unknown variables errors
  -N, --names          print variable names without values
  -n, --values         print only values of the given variable(s)
  -p, --load[=<file>]  read values from file
  -f                   alias of -p
      --system         read values from all system directories
  -r, --pattern <expression>
                       select setting that match expression
  -q, --quiet          do not echo variable set
  -w, --write          enable writing a value to variable
  -o                   does nothing
  -x                   does nothing
  -d                   alias of -h

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see sysctl(8).

LAB#3 - Interpreting Information in /proc

The information found in files in the /proc filesystem can be interpreted using the following commands:

3.1 - The free Command

The free command shows total, used, free, shared, buffered, cached and swapped memory:

[root@centos8 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3735        1135        1818          14         782        2363
Swap:          3279           0        3279

In the above example, you can see:

The command line switches of this command are:

[root@centos8 ~]# free --help

Usage:
 free [options]

Options:
 -b, --bytes         show output in bytes
     --kilo          show output in kilobytes
     --mega          show output in megabytes
     --giga          show output in gigabytes
     --tera          show output in terabytes
     --peta          show output in petabytes
 -k, --kibi          show output in kibibytes
 -m, --mebi          show output in mebibytes
 -g, --gibi          show output in gibibytes
     --tebi          show output in tebibytes
     --pebi          show output in pebibytes
 -h, --human         show human-readable output
     --si            use powers of 1000 not 1024
 -l, --lohi          show detailed low and high memory statistics
 -t, --total         show total for RAM + swap
 -s N, --seconds N   repeat printing every N seconds
 -c N, --count N     repeat printing N times, then exit
 -w, --wide          wide output

     --help     display this help and exit
 -V, --version  output version information and exit

For more details see free(1).

3.2 - The uptime and w Commands

Each of these commands show the load average over the past 1, 5 and 15 minutes:

[root@centos8 ~]# uptime
 04:39:03 up 1 day,  2:34,  1 user,  load average: 0.00, 0.00, 0.00
 
[root@centos8 ~]# w
 04:39:04 up 1 day,  2:34,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
trainee  pts/0    10.0.2.1         03:58    0.00s  0.11s  0.02s sshd: trainee [priv]

The load average indicates the number of processes being executed and waiting to be executed for the period concerned.

If the load average of a single-core system was 3.48 4.00 3.85 this would indicate a bottleneck since, on average:

The command line switches of these commands are:

[root@centos8 ~]# uptime --help

Usage:
 uptime [options]

Options:
 -p, --pretty   show uptime in pretty format
 -h, --help     display this help and exit
 -s, --since    system up since
 -V, --version  output version information and exit

For more details see uptime(1).

[root@centos8 ~]# w --help

Usage:
 w [options]

Options:
 -h, --no-header     do not print header
 -u, --no-current    ignore current process username
 -s, --short         short format
 -f, --from          show remote hostname field
 -o, --old-style     old style output
 -i, --ip-addr       display IP address instead of hostname (if possible)

     --help     display this help and exit
 -V, --version  output version information and exit

For more details see w(1).

3.3 - The iostat Command

The iostat command show disk, terminal and streamer statistics:

[root@centos8 ~]# iostat
bash: iostat: command not found...
Install package 'sysstat' to provide command 'iostat'? [N/y] y


 * Waiting in queue... 
The following packages have to be installed:
 lm_sensors-libs-3.4.0-22.20180522git70f7e08.el8.x86_64 Lm_sensors core libraries
 sysstat-11.7.3-5.el8.x86_64    Collection of performance monitoring tools for Linux
Proceed with changes? [N/y] y


 * Waiting in queue... 
 * Waiting for authentication... 
 * Waiting in queue... 
 * Downloading packages... 
 * Requesting data... 
 * Testing changes... 
 * Installing packages... 
Linux 4.18.0-305.3.1.el8.x86_64 (centos8.ittraining.loc)        29/06/21        _x86_64_(8 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.03    0.00    0.03    0.01    0.00   99.93

Device             tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.28         7.67         1.49     735338     142510
sdb               0.00         0.03         0.00       2995          0
scd0              0.00         0.00         0.00          2          0
dm-0              0.26         7.25         1.55     694786     148837
dm-1              0.00         0.02         0.00       2220          0
[root@centos8 ~]# iostat -d -x
Linux 4.18.0-305.3.1.el8.x86_64 (centos8.ittraining.loc)        30/06/21        _x86_64_        (8 CPU)

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
sda              0.20    0.16     11.67      1.81     0.00     0.03   0.48  17.45    6.79   69.99   0.01    58.28    11.33   9.13   0.33
sdb              0.00    0.00      0.02      0.00     0.00     0.00   0.00   0.00    0.13    0.00   0.00     8.81     0.00   0.51   0.00
scd0             0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00    0.20    0.00   0.00     0.20     0.00   0.90   0.00
dm-0             0.12    0.19      3.98      1.90     0.00     0.00   0.00   0.00    4.18   79.07   0.02    32.88    10.07  10.34   0.32
dm-1             0.00    0.00      0.01      0.00     0.00     0.00   0.00   0.00    0.76    0.00   0.00    21.35     0.00   0.68   0.00

The command line switches of this command are:

[root@centos8 ~]# iostat --help
Usage: iostat [ options ] [ <interval> [ <count> ] ]
Options are:
[ -c ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -s ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ]
[ -j { ID | LABEL | PATH | UUID | ... } ] [ --human ] [ -o JSON ]
[ [ -H ] -g <group_name> ] [ -p [ <device> [,...] | ALL ] ]
[ <device> [...] | ALL ]

3.4 - The hdparm Command

The hdparm command measures disk reads:

[root@centos8 ~]# hdparm -t /dev/sda

/dev/sda:
 Timing buffered disk reads: 1410 MB in  3.00 seconds = 469.98 MB/sec

3.5 - La Commande vmstat

The vmstat commands shows memory, pagination and processor statistics:

[root@centos8 ~]# vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 1765216   2256 866336    0    0     3     0    9   12  0  0 100  0  0
 0  0      0 1765136   2256 866336    0    0     0     0   57   80  0  0 100  0  0
 0  0      0 1765136   2256 866376    0    0     0     0   54   77  0  0 100  0  0
 0  0      0 1765136   2256 866376    0    0     0     0   66  100  0  0 100  0  0
 0  0      0 1765136   2256 866376    0    0     0     0  103  125  0  0 100  0  0
 0  0      0 1765108   2256 866376    0    0     0     0   64   86  0  0 100  0  0
 0  0      0 1765108   2256 866376    0    0     0     0   62   88  0  0 100  0  0
 0  0      0 1765108   2256 866376    0    0     0     0   68   97  0  0 100  0  0
 0  0      0 1765108   2256 866376    0    0     0     0   60   88  0  0 100  0  0
 0  0      0 1765108   2256 866376    0    0     0     0  177  251  0  0 100  0  0

The command line switches of this command are:

[root@centos8 ~]# vmstat --help

Usage:
 vmstat [options] [delay [count]]

Options:
 -a, --active           active/inactive memory
 -f, --forks            number of forks since boot
 -m, --slabs            slabinfo
 -n, --one-header       do not redisplay header
 -s, --stats            event counter statistics
 -d, --disk             disk statistics
 -D, --disk-sum         summarize disk statistics
 -p, --partition <dev>  partition specific statistics
 -S, --unit <char>      define display unit
 -w, --wide             wide output
 -t, --timestamp        show timestamp

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see vmstat(8).

Important : By default vmstat shows statistics from boot until current time.

3.6 - The mpstat Command

La commande mpstat affiche des statistiques détaillées sur le CPU :

[root@centos8 ~]# mpstat
Linux 4.18.0-305.3.1.el8.x86_64 (centos8.ittraining.loc)        29/06/21        _x86_64_(8 CPU)

04:53:22     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
04:53:22     all    0.03    0.00    0.01    0.02    0.01    0.01    0.00    0.00    0.00   99.92

If there are several CPU's in the system, statistics can be viewed by core and as an average:

[root@centos8 ~]# mpstat -P ALL
Linux 4.18.0-305.3.1.el8.x86_64 (centos8.ittraining.loc)        29/06/21        _x86_64_(8 CPU)

04:54:28     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
04:54:28     all    0.03    0.00    0.01    0.02    0.01    0.01    0.00    0.00    0.00   99.92
04:54:28       0    0.03    0.00    0.01    0.00    0.01    0.00    0.00    0.00    0.00   99.94
04:54:28       1    0.02    0.00    0.02    0.03    0.02    0.00    0.00    0.00    0.00   99.91
04:54:28       2    0.02    0.00    0.01    0.01    0.01    0.04    0.00    0.00    0.00   99.90
04:54:28       3    0.01    0.00    0.01    0.02    0.00    0.00    0.00    0.00    0.00   99.95
04:54:28       4    0.05    0.00    0.02    0.03    0.01    0.00    0.00    0.00    0.00   99.88
04:54:28       5    0.03    0.01    0.01    0.02    0.01    0.00    0.00    0.00    0.00   99.92
04:54:28       6    0.02    0.00    0.02    0.01    0.01    0.00    0.00    0.00    0.00   99.95
04:54:28       7    0.02    0.00    0.01    0.01    0.01    0.00    0.00    0.00    0.00   99.94

Finally, mpstat is capable of showing statistics over time. In the following example you can see 5 data sets, one taken every 2 seconds:

[root@centos8 ~]# mpstat -P ALL 2 5
Linux 4.18.0-305.3.1.el8.x86_64 (centos8.ittraining.loc)        29/06/21        _x86_64_        (8 CPU)

04:55:11     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
04:55:13     all    0.00    0.00    0.00    0.00    0.00    0.00    0.06    0.00    0.00   99.94
04:55:13       0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:13       1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:13       2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:13       3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:13       4    0.00    0.00    0.00    0.00    0.00    0.00    0.50    0.00    0.00   99.50
04:55:13       5    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:13       6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:13       7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

04:55:13     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
04:55:15     all    0.00    0.00    0.00    0.00    0.06    0.00    0.00    0.00    0.00   99.94
04:55:15       0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:15       1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:15       2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:15       3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:15       4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:15       5    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:15       6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:15       7    0.00    0.00    0.00    0.00    0.50    0.00    0.00    0.00    0.00   99.50

04:55:15     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
04:55:17     all    0.00    0.00    0.00    0.00    0.06    0.00    0.00    0.00    0.00   99.94
04:55:17       0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:17       1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:17       2    0.00    0.00    0.00    0.00    0.50    0.00    0.00    0.00    0.00   99.50
04:55:17       3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:17       4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:17       5    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:17       6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:17       7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

04:55:17     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
04:55:19     all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:19       0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:19       1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:19       2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:19       3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:19       4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:19       5    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:19       6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:19       7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

04:55:19     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
04:55:21     all    0.06    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.94
04:55:21       0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:21       1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:21       2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:21       3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:21       4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:21       5    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:21       6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:55:21       7    0.50    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.50

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    0.01    0.00    0.00    0.00    0.02    0.00    0.01    0.00    0.00   99.95
Average:       0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
Average:       1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
Average:       2    0.00    0.00    0.00    0.00    0.10    0.00    0.00    0.00    0.00   99.90
Average:       3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
Average:       4    0.00    0.00    0.00    0.00    0.00    0.00    0.10    0.00    0.00   99.90
Average:       5    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
Average:       6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
Average:       7    0.10    0.00    0.00    0.00    0.10    0.00    0.00    0.00    0.00   99.80

The command line switches of this command are:

[root@centos8 ~]# mpstat --help
Usage: mpstat [ options ] [ <interval> [ <count> ] ]
Options are:
[ -A ] [ -n ] [ -u ] [ -V ] [ -I { SUM | CPU | SCPU | ALL } ]
[ -N { <node_list> | ALL } ] [ -o JSON ] [ -P { <cpu_list> | ALL } ]

3.7 - The sar Command

The sar command can survey all system resources dependant upon the switch that is used. Several important switches are:

Switch Description
-u CPU usage in %
-q Number of processes in the process queue
-r Memory usage
-w Swap usage
-p Pagination usage
-b Buffer usage
-d Disk usage

The /usr/lib64/sa/sadc command is used to collect data:

[root@centos8 ~]# ls /usr/lib64/sa
sa1  sa2  sadc

The /usr/lib64/sa/sa1 script calls the /usr/lib/sa/sadc command and can use two switches:

Switch Description
-t Interval
-n Count

The /usr/lib64/sa/sa2 script also creates a log at /var/log/sa/sar<dd>, where <dd> is the day of the month.

[root@centos8 ~]# ls /var/log/sa/
sa29  s


ar29

Using CentOS / RHEL 8, the interval between collects is configured using systemd timers de systemd and not cron as was previously the case:

[root@centos8 ~]# cat /usr/lib/systemd/system/sysstat-collect.timer
# /usr/lib/systemd/system/sysstat-collect.timer
# (C) 2014 Tomasz Torcz <tomek@pipebreaker.pl>
#
# sysstat-11.7.3 systemd unit file:
#        Activates activity collector every 10 minutes

[Unit]
Description=Run system activity accounting tool every 10 minutes

[Timer]
OnCalendar=*:00/10

[Install]
WantedBy=sysstat.service

The OnCalendar value indicates a collect every 10 minutes.

To change this value, you need to create an override file in /etc/systemd/system/ by using the systemctl edit command. You should never edit directly files in /usr/lib/systemd/system :

[root@centos8 ~]# systemctl edit sysstat-collect.timer
[root@centos8 ~]# cat /etc/systemd/system/sysstat-collect.timer.d/override.conf 
[Unit]
Description=Run system activity accounting tool every 2 minutes

[Timer]
OnCalendar=
OnCalendar=*:00/2
AccuracySec=0

Important : Note the line OnCalendar= which is required to override the default value.

Now check if the configuration has been applied:

[root@centos8 ~]# systemctl status sysstat-collect.timer
● sysstat-collect.timer - Run system activity accounting tool every 2 minutes
   Loaded: loaded (/usr/lib/systemd/system/sysstat-collect.timer; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/sysstat-collect.timer.d
           └─override.conf
   Active: active (waiting) since Tue 2021-06-29 06:16:04 EDT; 3h 2min ago
  Trigger: Tue 2021-06-29 09:20:00 EDT; 1min 19s left

Jun 29 06:16:04 centos8.ittraining.loc systemd[1]: Started Run system activity accounting tool every 10 minutes.
[root@centos8 ~]# journalctl -g sysstat-collect.service
-- Logs begin at Mon 2021-06-28 02:04:10 EDT, end at Tue 2021-06-29 09:18:00 EDT. --
Jun 29 06:20:33 centos8.ittraining.loc systemd[1]: sysstat-collect.service: Succeeded.
Jun 29 06:26:29 centos8.ittraining.loc systemd[1]: sysstat-collect.service: Succeeded.
Jun 29 06:30:33 centos8.ittraining.loc systemd[1]: sysstat-collect.service: Succeeded.
Jun 29 06:40:33 centos8.ittraining.loc systemd[1]: sysstat-collect.service: Succeeded.
Jun 29 06:50:33 centos8.ittraining.loc systemd[1]: sysstat-collect.service: Succeeded.
Jun 29 07:00:33 centos8.ittraining.loc systemd[1]: sysstat-collect.service: Succeeded.
Jun 29 07:10:33 centos8.ittraining.loc systemd[1]: sysstat-collect.service: Succeeded.
Jun 29 07:20:33 centos8.ittraining.loc systemd[1]: sysstat-collect.service: Succeeded.
Jun 29 07:30:33 centos8.ittraining.loc systemd[1]: sysstat-collect.service: Succeeded.
Jun 29 07:40:33 centos8.ittraining.loc systemd[1]: sysstat-collect.service: Succeeded.
Jun 29 07:50:33 centos8.ittraining.loc systemd[1]: sysstat-collect.service: Succeeded.
Jun 29 07:53:56 centos8.ittraining.loc systemd[1]: sysstat-collect.service: Succeeded.
Jun 29 07:54:00 centos8.ittraining.loc systemd[1]: sysstat-collect.service: Succeeded.
Jun 29 07:56:00 centos8.ittraining.loc systemd[1]: sysstat-collect.service: Succeeded.
Jun 29 07:58:00 centos8.ittraining.loc systemd[1]: sysstat-collect.service: Succeeded.
Jun 29 08:00:00 centos8.ittraining.loc systemd[1]: sysstat-collect.service: Succeeded.
...

Execute the sar command:

[root@centos8 ~]# sar
Linux 4.18.0-305.3.1.el8.x86_64 (centos8.ittraining.loc)        29/06/21        _x86_64_        (8 CPU)

06:16:04     LINUX RESTART      (8 CPU)

06:20:33        CPU     %user     %nice   %system   %iowait    %steal     %idle
06:26:29        all      0.03      0.00      0.03      0.00      0.00     99.94
06:30:33        all      0.02      0.00      0.03      0.00      0.00     99.95
06:40:33        all      0.02      0.00      0.03      0.00      0.00     99.94
06:50:33        all      0.02      0.00      0.02      0.00      0.00     99.95
07:00:33        all      0.02      0.00      0.02      0.00      0.00     99.95
07:10:33        all      0.02      0.00      0.02      0.00      0.00     99.95
07:20:33        all      0.02      0.00      0.03      0.00      0.00     99.95
07:30:33        all      0.02      0.01      0.03      0.00      0.00     99.94
07:40:33        all      0.03      0.00      0.04      0.00      0.00     99.93
07:50:33        all      0.03      0.00      0.03      0.00      0.00     99.94
07:53:56        all      0.08      0.00      0.06      0.00      0.00     99.86
07:54:00        all      0.09      0.00      0.06      0.00      0.00     99.85
Average:        all      0.03      0.00      0.03      0.00      0.00     99.94

07:55:44     LINUX RESTART      (8 CPU)

07:56:00        CPU     %user     %nice   %system   %iowait    %steal     %idle
07:58:00        all      0.03      0.00      0.03      0.00      0.00     99.94
08:00:00        all      0.02      0.00      0.04      0.00      0.00     99.94
08:02:00        all      0.02      0.00      0.03      0.00      0.00     99.94
08:04:00        all      0.02      0.00      0.03      0.00      0.00     99.95
08:06:00        all      0.02      0.00      0.03      0.00      0.00     99.95
08:08:00        all      0.02      0.00      0.04      0.00      0.00     99.94
08:10:00        all      0.02      0.00      0.03      0.00      0.00     99.95
08:12:00        all      0.03      0.00      0.03      0.00      0.00     99.95
08:14:00        all      0.02      0.00      0.03      0.01      0.00     99.94
08:16:00        all      0.02      0.00      0.03      0.00      0.00     99.95
08:18:00        all      0.02      0.00      0.03      0.00      0.00     99.95
08:20:00        all      0.02      0.00      0.04      0.00      0.00     99.94
08:22:00        all      0.02      0.00      0.03      0.00      0.00     99.95
08:24:00        all      0.02      0.00      0.02      0.00      0.00     99.95
08:26:00        all      0.02      0.00      0.03      0.00      0.00     99.95
08:28:00        all      0.02      0.00      0.04      0.00      0.00     99.94
08:30:00        all      0.02      0.05      0.05      0.00      0.00     99.87
08:32:00        all      0.02      0.00      0.04      0.00      0.00     99.94
08:34:00        all      0.02      0.00      0.04      0.00      0.00     99.94
08:36:00        all      0.03      0.00      0.04      0.00      0.00     99.94
08:38:00        all      0.02      0.00      0.04      0.00      0.00     99.94
08:40:00        all      0.02      0.00      0.04      0.00      0.00     99.94
08:42:00        all      0.02      0.00      0.03      0.00      0.00     99.94
08:44:00        all      0.03      0.00      0.03      0.00      0.00     99.94
08:46:00        all      0.02      0.00      0.03      0.00      0.00     99.94
08:48:00        all      0.03      0.00      0.03      0.00      0.00     99.95
08:50:00        all      0.02      0.00      0.04      0.00      0.00     99.94
08:52:00        all      0.02      0.00      0.06      0.00      0.00     99.92
08:54:00        all      0.02      0.00      0.03      0.00      0.00     99.95
08:56:00        all      0.02      0.00      0.04      0.00      0.00     99.94
08:58:00        all      0.02      0.00      0.02      0.00      0.00     99.96
09:00:00        all      0.07      0.00      0.05      0.00      0.00     99.88
09:02:00        all      0.02      0.00      0.04      0.00      0.00     99.94
09:04:00        all      0.02      0.00      0.03      0.00      0.00     99.95
09:06:00        all      0.02      0.00      0.04      0.00      0.00     99.94
09:08:00        all      0.02      0.00      0.04      0.00      0.00     99.94
09:10:00        all      0.02      0.00      0.03      0.00      0.00     99.95
09:12:00        all      0.02      0.00      0.03      0.00      0.00     99.94

09:12:00        CPU     %user     %nice   %system   %iowait    %steal     %idle
09:14:00        all      0.02      0.00      0.03      0.00      0.00     99.95
09:16:00        all      0.02      0.00      0.06      0.00      0.00     99.92
09:18:00        all      0.03      0.00      0.03      0.00      0.00     99.95
09:20:00        all      0.02      0.00      0.03      0.00      0.00     99.94
Average:        all      0.02      0.00      0.03      0.00      0.00     99.94

CPU Stats

Use the -u switch:

[root@centos8 ~]# sar -u 5 3
Linux 4.18.0-305.3.1.el8.x86_64 (centos8.ittraining.loc)        29/06/21        _x86_64_        (8 CPU)

09:22:52        CPU     %user     %nice   %system   %iowait    %steal     %idle
09:22:57        all      0.03      0.00      0.03      0.00      0.00     99.95
09:23:02        all      0.03      0.00      0.03      0.00      0.00     99.95
09:23:07        all      0.00      0.00      0.03      0.00      0.00     99.97
Average:        all      0.02      0.00      0.03      0.00      0.00     99.96

More information can be shown by using the ALL argument:

[root@centos8 ~]# sar -u ALL 5 3
Linux 4.18.0-305.3.1.el8.x86_64 (centos8.ittraining.loc)        29/06/21        _x86_64_(8 CPU)

01:49:14        CPU      %usr     %nice      %sys   %iowait    %steal      %irq     %soft    %guest    %gnice     %idle
01:49:19        all      0.03      0.00      0.00      0.00      0.00      0.03      0.00      0.00      0.00     99.95
01:49:24        all      0.03      0.00      0.03      0.00      0.00      0.10      0.05      0.00      0.00     99.80
01:49:29        all      0.00      0.00      0.00      0.25      0.00      0.10      0.05      0.00      0.00     99.60
Average:        all      0.02      0.00      0.01      0.08      0.00      0.08      0.03      0.00      0.00     99.78

To see the statistics from a specific core, use the -P switch:

[root@centos8 ~]# sar -u -P 1 5 3
Linux 4.18.0-305.3.1.el8.x86_64 (centos8.ittraining.loc)        29/06/21        _x86_64_        (8 CPU)

01:51:52        CPU     %user     %nice   %system   %iowait    %steal     %idle
01:51:57          1      0.00      0.00      0.00      0.00      0.00    100.00
01:52:02          1      0.20      0.00      0.00      0.00      0.00     99.80
01:52:07          1      0.00      0.00      0.00      0.00      0.00    100.00
Average:          1      0.07      0.00      0.00      0.00      0.00     99.93
[root@centos8 ~]# sar -u -P 5 5 3
Linux 4.18.0-305.3.1.el8.x86_64 (centos8.ittraining.loc)        29/06/21        _x86_64_        (8 CPU)

01:52:16        CPU     %user     %nice   %system   %iowait    %steal     %idle
01:52:21          5      0.00      0.00      0.00      0.00      0.00    100.00
01:52:26          5      0.00      0.00      0.00      0.00      0.00    100.00
01:52:31          5      0.00      0.00      0.00      0.00      0.00    100.00
Average:          5      0.00      0.00      0.00      0.00      0.00    100.00

Memory and Swap Statistics

Use the -r switch to see memory statistics:

[root@centos8 ~]# sar -r 5 3
Linux 4.18.0-305.3.1.el8.x86_64 (centos8.ittraining.loc)        30/06/21        _x86_64_(8 CPU)

07:33:32    kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
07:33:37      1647240   2297232   2177792     56.94      3356    827396   5096432     70.94    359072   1486368         0
07:33:42      1647232   2297224   2177800     56.94      3356    827396   5095788     70.93    359072   1486300         0
07:33:47      1647232   2297224   2177800     56.94      3356    827396   5095788     70.93    359072   1486376         0
Average:      1647235   2297227   2177797     56.94      3356    827396   5096003     70.94    359072   1486348         0

Use the -S switch to see swap statistics:

[root@centos8 ~]# sar -S 5 3
Linux 4.18.0-305.3.1.el8.x86_64 (centos8.ittraining.loc)        30/06/21        _x86_64_(8 CPU)

07:31:58    kbswpfree kbswpused  %swpused  kbswpcad   %swpcad
07:32:03      3358716         0      0.00         0      0.00
07:32:08      3358716         0      0.00         0      0.00
07:32:13      3358716         0      0.00         0      0.00
Average:      3358716         0      0.00         0      0.00

I/O Statistics

Use the -b switch:

[root@centos8 ~]# sar -b 5 3
Linux 4.18.0-305.3.1.el8.x86_64 (centos8.ittraining.loc)        29/06/21        _x86_64_        (8 CPU)

09:24:49          tps      rtps      wtps   bread/s   bwrtn/s
09:24:54         0.00      0.00      0.00      0.00      0.00
09:24:59         1.20      0.00      1.20      0.00     20.20
09:25:04         0.00      0.00      0.00      0.00      0.00
Average:         0.40      0.00      0.40      0.00      6.73

Disk I/O Statistics

Use the -d switch:

[root@centos8 ~]# sar -d 5 3
Linux 4.18.0-305.3.1.el8.x86_64 (centos8.ittraining.loc)        29/06/21        _x86_64_        (8 CPU)

09:25:45          DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
09:25:50       dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
09:25:50      dev8-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
09:25:50      dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
09:25:50     dev253-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
09:25:50     dev253-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

09:25:50          DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
09:25:55       dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
09:25:55      dev8-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
09:25:55      dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
09:25:55     dev253-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
09:25:55     dev253-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

09:25:55          DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
09:26:00       dev8-0      0.60      0.00      0.30      0.50      0.01     13.00     13.00      0.78
09:26:00      dev8-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
09:26:00      dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
09:26:00     dev253-0      0.60      0.00      0.50      0.83      0.01     12.67     13.00      0.78
09:26:00     dev253-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:          DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
Average:       dev8-0      0.20      0.00      0.10      0.50      0.00     13.00     13.00      0.26
Average:      dev8-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:      dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:     dev253-0      0.20      0.00      0.17      0.83      0.00     12.67     13.00      0.26
Average:     dev253-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

The DEV column identifies the disks by their major/minor numbers. To see the names of the disks add the, -p switch:

[root@centos8 ~]# sar -p -d 5 3
Linux 4.18.0-305.3.1.el8.x86_64 (centos8.ittraining.loc)        30/06/21        _x86_64_        (8 CPU)

07:48:32          DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
07:48:37          sda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:48:37          sdb      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:48:37          sr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:48:37    cl_centos8-root      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:48:37    cl_centos8-swap      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

07:48:37          DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
07:48:42          sda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:48:42          sdb      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:48:42          sr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:48:42    cl_centos8-root      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:48:42    cl_centos8-swap      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

07:48:42          DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
07:48:47          sda      0.40      0.00      0.40      1.00      0.02     56.00     56.50      2.26
07:48:47          sdb      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:48:47          sr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:48:47    cl_centos8-root      0.40      0.00      0.80      2.00      0.02     56.00     56.50      2.26
07:48:47    cl_centos8-swap      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:          DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
Average:          sda      0.13      0.00      0.13      1.00      0.01     56.00     56.50      0.75
Average:          sdb      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:          sr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:    cl_centos8-root      0.13      0.00      0.27      2.00      0.01     56.00     56.50      0.75
Average:    cl_centos8-swap      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

The command line switches of this command are:

[root@centos8 ~]# sar --help
Usage: sar [ options ] [ <interval> [ <count> ] ]
Main options and reports (report name between square brackets):
        -B      Paging statistics [A_PAGE]
        -b      I/O and transfer rate statistics [A_IO]
        -d      Block devices statistics [A_DISK]
        -F [ MOUNT ]
                Filesystems statistics [A_FS]
        -H      Hugepages utilization statistics [A_HUGE]
        -I { <int_list> | SUM | ALL }
                Interrupts statistics [A_IRQ]
        -m { <keyword> [,...] | ALL }
                Power management statistics [A_PWR_...]
                Keywords are:
                CPU     CPU instantaneous clock frequency
                FAN     Fans speed
                FREQ    CPU average clock frequency
                IN      Voltage inputs
                TEMP    Devices temperature
                USB     USB devices plugged into the system
        -n { <keyword> [,...] | ALL }
                Network statistics [A_NET_...]
                Keywords are:
                DEV     Network interfaces
                EDEV    Network interfaces (errors)
                NFS     NFS client
                NFSD    NFS server
                SOCK    Sockets (v4)
                IP      IP traffic      (v4)
                EIP     IP traffic      (v4) (errors)
                ICMP    ICMP traffic    (v4)
                EICMP   ICMP traffic    (v4) (errors)
                TCP     TCP traffic     (v4)
                ETCP    TCP traffic     (v4) (errors)
                UDP     UDP traffic     (v4)
                SOCK6   Sockets (v6)
                IP6     IP traffic      (v6)
                EIP6    IP traffic      (v6) (errors)
                ICMP6   ICMP traffic    (v6)
                EICMP6  ICMP traffic    (v6) (errors)
                UDP6    UDP traffic     (v6)
                FC      Fibre channel HBAs
                SOFT    Software-based network processing
        -q      Queue length and load average statistics [A_QUEUE]
        -r [ ALL ]
                Memory utilization statistics [A_MEMORY]
        -S      Swap space utilization statistics [A_MEMORY]
        -u [ ALL ]
                CPU utilization statistics [A_CPU]
        -v      Kernel tables statistics [A_KTABLES]
        -W      Swapping statistics [A_SWAP]
        -w      Task creation and system switching statistics [A_PCSW]
        -y      TTY devices statistics [A_SERIAL]

USB Modules

The Universal Serial Bus can offer data transfer speeds of upto 480Mb/s for version 2.0 and upto 4.8 Gb/s for version 3.0. Under Linux the USB modules are:

USB Version Module Name
1.0\1.1 UHCI Universal Controller Host Interface
OHCI Open Controller Host Interface
2.0 EHCI Enhanced Host Controller Interface
3.0 XHCI Extensible Host Controller Interface

The following table shows a list of commonly used USB modules:

Module Peripheral
usb_storage Block devices
usbhid Human Interface Device
snd-usb-audio Sound cards
usbvidéo Video acquisition cards
irda-usb IR peripherals
usbnet NICs

These modules can be loaded by any one of the following:

udev

Since the 2.6 Kernel series, Linux capable of hotplugging. Linux uses three componants to manage hotplugging:

The roles of each componant are as follows:

When Linux is booted, udev plays an important role:

udev uses the sysfs filesystem mounted on /sys which renders the peripherals visible to udev in user space. For example when a USB stick is inserted, udev creates /dev/sdb1 automatically

The main configuration file for udev is /etc/udev/udev.conf :

[root@centos8 ~]# cat /etc/udev/udev.conf
# see udev.conf(5) for details
#
# udevd is also started in the initrd.  When this file is modified you might
# also want to rebuild the initrd, so that it will include the modified configuration.

#udev_log="info"

Rules files can be foud in /lib/udev/rules.d/ :

[root@centos8 ~]# ls /lib/udev/rules.d/
01-md-raid-creating.rules              70-uaccess.rules
10-dm.rules                            70-wacom.rules
11-dm-lvm.rules                        71-biosdevname.rules
11-dm-mpath.rules                      71-nvmf-iopolicy-netapp.rules
11-dm-parts.rules                      71-prefixdevname.rules
13-dm-disk.rules                       71-seat.rules
39-usbmuxd.rules                       73-idrac.rules
40-elevator.rules                      73-seat-late.rules
40-libgphoto2.rules                    75-net-description.rules
40-redhat.rules                        75-probe_mtd.rules
40-usb-blacklist.rules                 75-rdma-description.rules
40-usb_modeswitch.rules                77-mm-cinterion-port-types.rules
50-udev-default.rules                  77-mm-dell-port-types.rules
60-alias-kmsg.rules                    77-mm-ericsson-mbm.rules
60-block.rules                         77-mm-fibocom-port-types.rules
60-cdrom_id.rules                      77-mm-haier-port-types.rules
60-drm.rules                           77-mm-huawei-net-port-types.rules
60-evdev.rules                         77-mm-longcheer-port-types.rules
60-fido-id.rules                       77-mm-mtk-port-types.rules
60-input-id.rules                      77-mm-nokia-port-types.rules
60-libfprint-2-autosuspend.rules       77-mm-pcmcia-device-blacklist.rules
60-net.rules                           77-mm-quectel-port-types.rules
60-persistent-alsa.rules               77-mm-sierra.rules
60-persistent-input.rules              77-mm-simtech-port-types.rules
60-persistent-storage.rules            77-mm-telit-port-types.rules
60-persistent-storage-tape.rules       77-mm-ublox-port-types.rules
60-persistent-v4l.rules                77-mm-usb-device-blacklist.rules
60-raw.rules                           77-mm-usb-serial-adapters-greylist.rules
60-rdma-ndd.rules                      77-mm-x22x-port-types.rules
60-rdma-persistent-naming.rules        77-mm-zte-port-types.rules
60-sensor.rules                        78-sound-card.rules
60-serial.rules                        80-drivers.rules
60-tpm-udev.rules                      80-iio-sensor-proxy.rules
61-gdm.rules                           80-libinput-device-groups.rules
61-gnome-bluetooth-rfkill.rules        80-mm-candidate.rules
61-gnome-settings-daemon-rfkill.rules  80-net-setup-link.rules
61-scsi-sg3_id.rules                   80-udisks2.rules
62-multipath.rules                     81-kvm-rhel.rules
63-fc-wwpn-id.rules                    84-nm-drivers.rules
63-md-raid-arrays.rules                85-nm-unmanaged.rules
63-scsi-sg3_symlink.rules              85-regulatory.rules
64-btrfs.rules                         90-alsa-restore.rules
64-md-raid-assembly.rules              90-bolt.rules
65-libwacom.rules                      90-fwupd-devices.rules
65-md-incremental.rules              Limiter les Ressources  90-iprutils.rules
65-sane-backends.rules                 90-libinput-fuzz-override.rules
66-kpartx.rules                        90-nm-thunderbolt.rules
68-del-part-nodes.rules                90-pulseaudio.rules
69-btattach-bcm.rules                  90-rdma-hw-modules.rules
69-cd-sensors.rules                    90-rdma-ulp-modules.rules
69-dm-lvm-metad.rules                  90-rdma-umad.rules
69-libmtp.rules                        90-vconsole.rules
69-md-clustered-confirm-device.rules   91-drm-modeset.rules
70-hypervfcopy.rules                   95-cd-devices.rules
70-hypervkvp.rules                     95-dm-notify.rules
70-hypervvss.rules                     95-upower-csr.rules
70-joystick.rules                      95-upower-hid.rules
70-mouse.rules                         95-upower-wup.rules
70-nvmf-autoconnect.rules              98-kexec.rules
70-power-switch.rules                  99-qemu-guest-agent.rules
70-printers.rules                      99-systemd.rules
70-spice-vdagentd.rules                99-vmware-scsi-udev.rules
70-touchpad.rules

Important : You can create your own rules by putting them in the 99-local.rules file.

The default udev rule file is 50-udev-default.rules:

[root@centos8 ~]# cat /lib/udev/rules.d/50-udev-default.rules | more
# do not edit this file, it will be overwritten on update

# run a command on remove events
ACTION=="remove", ENV{REMOVE_CMD}!="", RUN+="$env{REMOVE_CMD}"
ACTION=="remove", GOTO="default_end"

SUBSYSTEM=="virtio-ports", KERNEL=="vport*", ATTR{name}=="?*", SYMLINK+="virtio-ports/$attr{name}"

# select "system RTC" or just use the first one
SUBSYSTEM=="rtc", ATTR{hctosys}=="1", SYMLINK+="rtc"
SUBSYSTEM=="rtc", KERNEL=="rtc0", SYMLINK+="rtc", OPTIONS+="link_priority=-100"

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb"
ENV{MODALIAS}!="", IMPORT{builtin}="hwdb --subsystem=$env{SUBSYSTEM}"

ACTION!="add", GOTO="default_end"

SUBSYSTEM=="tty", KERNEL=="ptmx", GROUP="tty", MODE="0666"
SUBSYSTEM=="tty", KERNEL=="tty", GROUP="tty", MODE="0666"
SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="sclp_line[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="ttysclp[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="3270/tty[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="vc", KERNEL=="vcs*|vcsa*", GROUP="tty"
KERNEL=="tty[A-Z]*[0-9]|ttymxc[0-9]*|pppox[0-9]*|ircomm[0-9]*|noz[0-9]*|rfcomm[0-9]*", GROUP="dialout"

SUBSYSTEM=="mem", KERNEL=="mem|kmem|port", GROUP="kmem", MODE="0640"

SUBSYSTEM=="input", GROUP="input"
SUBSYSTEM=="input", KERNEL=="js[0-9]*", MODE="0664"

SUBSYSTEM=="video4linux", GROUP="video"
SUBSYSTEM=="graphics", GROUP="video"
SUBSYSTEM=="drm", KERNEL!="renderD*", GROUP="video"
SUBSYSTEM=="dvb", GROUP="video"
SUBSYSTEM=="media", GROUP="video"
SUBSYSTEM=="cec", GROUP="video"

SUBSYSTEM=="drm", KERNEL=="renderD*", GROUP="render", MODE="0666"
SUBSYSTEM=="kfd", GROUP="render", MODE="0666"

SUBSYSTEM=="sound", GROUP="audio", \
  OPTIONS+="static_node=snd/seq", OPTIONS+="static_node=snd/timer"
--More--

Each rule has the following format:

KEY, [KEY, …] NAME [, SYMLINK]

The Key is a type=value pair which uniquely identifies a peripheral. The type can be one of the following:

Type Description Examples
BUS Bus type usb, scsi, ide
KERNEL The default name given to the peripheral by the kernel hda, ttyUSB0, lp0
SUBSYSTEM The default sub-system name given by the Kernel, generally identical to the BUS value usb, scsi
DRIVER The name of the module used by the peripheral usb-storage
ID The position of the peripheral on its bus PCI bus id, USB id
PLACE The topological position of a USB oeripheral on its bus. S/O
SYSFS{filename} The name of the peripheral file in /sys. This file contains the manufacturer's name, the label, the serial number and the UUID of the peripheral. Each rule can contains upto five references to files. S/O
PROGRAM An eventual external program to be called in order to identify the peripheral S/O
RESULT Value expected from PROGRAM S/O

NAME and SYMLINK are used to tell udev what to do with the peripheral:

Type Description
NAME The name of the peripheral in /dev
SYMLINK The eventual symbolic links that point to NAME

The udevadm Command

To obtain information from udev on a particular peripheral, you can use the udevadm command which has replaced the udevinfo command available in Red Hat/CentOS 5:

[root@centos8 ~]# udevadm info --query=all -n /dev/sda
P: /devices/pci0000:00/0000:00:07.0/ata3/host2/target2:0:0/2:0:0:0/block/sda
N: sda
S: disk/by-id/ata-QEMU_HARDDISK_QM00005
S: disk/by-id/scsi-0ATA_QEMU_HARDDISK_QM00005
S: disk/by-id/scsi-1ATA_QEMU_HARDDISK_QM00005
S: disk/by-id/scsi-SATA_QEMU_HARDDISK_QM00005
S: disk/by-path/pci-0000:00:07.0-ata-1
E: DEVLINKS=/dev/disk/by-path/pci-0000:00:07.0-ata-1 /dev/disk/by-id/scsi-SATA_QEMU_HARDDISK_QM00005 /dev/disk/by-id/ata-QEMU_HARDDISK_QM00005 /dev/disk/by-id/scsi-0ATA_QEMU_HARDDISK_QM00005 /dev/disk/by-id/scsi-1ATA_QEMU_HARDDISK_QM00005
E: DEVNAME=/dev/sda
E: DEVPATH=/devices/pci0000:00/0000:00:07.0/ata3/host2/target2:0:0/2:0:0:0/block/sda
E: DEVTYPE=disk
E: ID_ATA=1
E: ID_ATA_FEATURE_SET_SMART=1
E: ID_ATA_FEATURE_SET_SMART_ENABLED=1
E: ID_ATA_SATA=1
E: ID_ATA_WRITE_CACHE=1
E: ID_ATA_WRITE_CACHE_ENABLED=1
E: ID_BUS=ata
E: ID_MODEL=QEMU_HARDDISK
E: ID_MODEL_ENC=QEMU\x20HARDDISK\x20\x20\x20
E: ID_PART_TABLE_TYPE=dos
E: ID_PART_TABLE_UUID=b39ec5c8
E: ID_PATH=pci-0000:00:07.0-ata-1
E: ID_PATH_TAG=pci-0000_00_07_0-ata-1
E: ID_REVISION=2.5+
E: ID_SCSI=1
E: ID_SCSI_INQUIRY=1
E: ID_SERIAL=QEMU_HARDDISK_QM00005
E: ID_SERIAL_SHORT=QM00005
E: ID_TYPE=disk
E: ID_VENDOR=ATA
E: ID_VENDOR_ENC=ATA\x20\x20\x20\x20\x20
E: MAJOR=8
E: MINOR=0
E: SCSI_IDENT_LUN_ATA=QEMU_HARDDISK_QM00005
E: SCSI_IDENT_LUN_T10=ATA_QEMU_HARDDISK_QM00005
E: SCSI_IDENT_LUN_VENDOR=QM00005
E: SCSI_IDENT_SERIAL=QM00005
E: SCSI_MODEL=QEMU_HARDDISK
E: SCSI_MODEL_ENC=QEMU\x20HARDDISK\x20\x20\x20
E: SCSI_REVISION=2.5+
E: SCSI_TPGS=0
E: SCSI_TYPE=disk
E: SCSI_VENDOR=ATA
E: SCSI_VENDOR_ENC=ATA\x20\x20\x20\x20\x20
E: SUBSYSTEM=block
E: TAGS=:systemd:
E: USEC_INITIALIZED=8735808

The command line switches of this command are:

[root@centos8 ~]# udevadm --help
udevadm [--help] [--version] [--debug] COMMAND [COMMAND OPTIONS]

Send control commands or test the device manager.

Commands:
  info          Query sysfs or the udev database
  trigger       Request events from the kernel
  settle        Wait for pending udev events
  control       Control the udev daemon
  monitor       Listen to kernel and udev events
  test          Test an event run
  test-builtin  Test a built-in command

[root@centos8 ~]# udevadm info --help
udevadm info [OPTIONS] [DEVPATH|FILE]

Query sysfs or the udev database.

  -h --help                   Print this message
  -V --version                Print version of the program
  -q --query=TYPE             Query device information:
       name                     Name of device node
       symlink                  Pointing to node
       path                     sysfs device path
       property                 The device properties
       all                      All values
  -p --path=SYSPATH           sysfs device path used for query or attribute walk
  -n --name=NAME              Node or symlink name used for query or attribute walk
  -r --root                   Prepend dev directory to path names
  -a --attribute-walk         Print all key matches walking along the chain
                              of parent devices
  -d --device-id-of-file=FILE Print major:minor of device containing this file
  -x --export                 Export key/value pairs
  -P --export-prefix          Export the key name with a prefix
  -e --export-db              Export the content of the udev database
  -c --cleanup-db             Clean up the udev database

The /sys Filesystem

The virtual filesystem /sys was introduced with the 2.6 Kernel. Its role is to identify and describe peripherals for udev:

[root@centos8 ~]# ls -l /sys
total 0
drwxr-xr-x.   2 root root 0 Jul 12 08:15 block
drwxr-xr-x.  33 root root 0 Jul 12 08:15 bus
drwxr-xr-x.  57 root root 0 Jul 12 08:15 class
drwxr-xr-x.   4 root root 0 Jul 12 08:15 dev
drwxr-xr-x.  14 root root 0 Jul 12 08:15 devices
drwxr-xr-x.   6 root root 0 Jul 12 08:15 firmware
drwxr-xr-x.   9 root root 0 Jul 12 08:15 fs
drwxr-xr-x.   2 root root 0 Jul 12 08:15 hypervisor
drwxr-xr-x.  15 root root 0 Jul 12 08:15 kernel
drwxr-xr-x. 153 root root 0 Jul 12 08:15 module
drwxr-xr-x.   2 root root 0 Jul 12 08:15 power

Each directory contains specific information:

For example:

[root@centos ~]# cat /sys/block/sda/sda1/size
2097152

The figure returned is in sectors.

LAB #4 - Limiting Ressources

4.1 - ulimit

Resources available to users can be limited by using the ulimit command.

The ulimit command manages two limits:

The soft limit is the limit imposed on the user whilst the hard limit is the limit that a user can obtain once he has gone over the soft limit.

Only root can position a hard limit and only if the limit does not exceed real resource levels.

Root can define limits by editing the /etc/security/limits.conf file:

[root@centos8 ~]# cat /etc/security/limits.conf
# /etc/security/limits.conf
#
#This file sets the resource limits for the users logged in via PAM.
#It does not affect resource limits of the system services.
#
#Also note that configuration files in /etc/security/limits.d directory,
#which are read in alphabetical order, override the settings in this
#file in case the domain is the same or more specific.
#That means for example that setting a limit for wildcard domain here
#can be overriden with a wildcard setting in a config file in the
#subdirectory, but a user specific setting here can be overriden only
#with a user specific setting in the subdirectory.
#
#Each line describes a limit for a user in the form:
#
#<domain>        <type>  <item>  <value>
#
#Where:
#<domain> can be:
#        - a user name
#        - a group name, with @group syntax
#        - the wildcard *, for default entry
#        - the wildcard %, can be also used with %group syntax,
#                 for maxlogin limit
#
#<type> can have the two values:
#        - "soft" for enforcing the soft limits
#        - "hard" for enforcing hard limits
#
#<item> can be one of the following:
#        - core - limits the core file size (KB)
#        - data - max data size (KB)
#        - fsize - maximum filesize (KB)
#        - memlock - max locked-in-memory address space (KB)
#        - nofile - max number of open file descriptors
#        - rss - max resident set size (KB)
#        - stack - max stack size (KB)
#        - cpu - max CPU time (MIN)
#        - nproc - max number of processes
#        - as - address space limit (KB)
#        - maxlogins - max number of logins for this user
#        - maxsyslogins - max number of logins on the system
#        - priority - the priority to run user process with
#        - locks - max number of file locks the user can hold
#        - sigpending - max number of pending signals
#        - msgqueue - max memory used by POSIX message queues (bytes)
#        - nice - max nice priority allowed to raise to values: [-20, 19]
#        - rtprio - max realtime priority
#
#<domain>      <type>  <item>         <value>
#

#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4

# End of file

Important : The limit can be a number or the word unlimited.

For example if root adds the two following lines to /etc/security/limits.conf:

...
trainee                soft        nofile          1024
trainee                hard        nofile          4096
...

the number of open files for trainee is limited to 1024. However trainee can increase this limit to 4 096 by using the following command:

$ ulimit -n 4096

To see the list of the current limits use the -a switch:

[root@centos8 ~]# ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 14702
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 14702
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

The command line switches of this command are:

[root@centos8 ~]# help ulimit
ulimit: ulimit [-SHabcdefiklmnpqrstuvxPT] [limit]
    Modify shell resource limits.
    
    Provides control over the resources available to the shell and processes
    it creates, on systems that allow such control.
    
    Options:
      -S        use the `soft' resource limit
      -H        use the `hard' resource limit
      -a        all current limits are reported
      -b        the socket buffer size
      -c        the maximum size of core files created
      -d        the maximum size of a process's data segment
      -e        the maximum scheduling priority (`nice')
      -f        the maximum size of files written by the shell and its children
      -i        the maximum number of pending signals
      -k        the maximum number of kqueues allocated for this process
      -l        the maximum size a process may lock into memory
      -m        the maximum resident set size
      -n        the maximum number of open file descriptors
      -p        the pipe buffer size
      -q        the maximum number of bytes in POSIX message queues
      -r        the maximum real-time scheduling priority
      -s        the maximum stack size
      -t        the maximum amount of cpu time in seconds
      -u        the maximum number of user processes
      -v        the size of virtual memory
      -x        the maximum number of file locks
      -P        the maximum number of pseudoterminals
      -T        the maximum number of threads
    
    Not all options are available on all platforms.
    
    If LIMIT is given, it is the new value of the specified resource; the
    special LIMIT values `soft', `hard', and `unlimited' stand for the
    current soft limit, the current hard limit, and no limit, respectively.
    Otherwise, the current value of the specified resource is printed.  If
    no option is given, then -f is assumed.
    
    Values are in 1024-byte increments, except for -t, which is in seconds,
    -p, which is in increments of 512 bytes, and -u, which is an unscaled
    number of processes.
    
    Exit Status:
    Returns success unless an invalid option is supplied or an error occurs.

4.2 - CGroups

Control Groups, also called CGroups are another, more modern way, of limiting resources.

CGroups are organised hierarchially just like processes. However as opposed to processes, CGroups are organised into multiples hierarchies called Resource Controllers or simply Controllers.

To consult the cgroup hierarchies, use the lssubsys command:

[root@centos8 ~]# lssubsys -am
bash: lssubsys: command not found...
Install package 'libcgroup-tools' to provide command 'lssubsys'? [N/y] y


 * Waiting in queue... 
The following packages have to be installed:
 libcgroup-0.41-19.el8.x86_64   Library to control and monitor control groups
 libcgroup-tools-0.41-19.el8.x86_64     Command-line utility programs, services and daemons for libcgroup
Proceed with changes? [N/y] y


 * Waiting in queue... 
 * Waiting for authentication... 
 * Waiting in queue... 
 * Downloading packages... 
 * Requesting data... 
 * Testing changes... 
 * Installing packages... 
cpuset /sys/fs/cgroup/cpuset
cpu,cpuacct /sys/fs/cgroup/cpu,cpuacct
blkio /sys/fs/cgroup/blkio
memory /sys/fs/cgroup/memory
devices /sys/fs/cgroup/devices
freezer /sys/fs/cgroup/freezer
net_cls,net_prio /sys/fs/cgroup/net_cls,net_prio
perf_event /sys/fs/cgroup/perf_event
hugetlb /sys/fs/cgroup/hugetlb
pids /sys/fs/cgroup/pids
rdma /sys/fs/cgroup/rdma
[root@centos8 ~]# lssubsys -am
cpuset /sys/fs/cgroup/cpuset
cpu,cpuacct /sys/fs/cgroup/cpu,cpuacct
blkio /sys/fs/cgroup/blkio
memory /sys/fs/cgroup/memory
devices /sys/fs/cgroup/devices
freezer /sys/fs/cgroup/freezer
net_cls,net_prio /sys/fs/cgroup/net_cls,net_prio
perf_event /sys/fs/cgroup/perf_event
hugetlb /sys/fs/cgroup/hugetlb
pids /sys/fs/cgroup/pids
rdma /sys/fs/cgroup/rdma

Systemd organises the processes in each cgroup. As a result, the CGroup resource management is closely aligned to Systemd's units.

At the top of the hierarchy we can see the root slice --.slice, under which we can find:

Under these slices can be found:

Slices can be consulted with the following command:

[root@centos8 ~]# systemctl list-units --type=slice
UNIT                                        LOAD   ACTIVE SUB    DESCRIPTION                                
-.slice                                     loaded active active Root Slice                                 
machine.slice                               loaded active active Virtual Machine and Container Slice        
system-getty.slice                          loaded active active system-getty.slice                         
system-lvm2\x2dpvscan.slice                 loaded active active system-lvm2\x2dpvscan.slice                
system-sshd\x2dkeygen.slice                 loaded active active system-sshd\x2dkeygen.slice                
system-systemd\x2dfsck.slice                loaded active active system-systemd\x2dfsck.slice               
system-systemd\x2dhibernate\x2dresume.slice loaded active active system-systemd\x2dhibernate\x2dresume.slice
system-user\x2druntime\x2ddir.slice         loaded active active system-user\x2druntime\x2ddir.slice        
system-vncserver.slice                      loaded active active system-vncserver.slice                     
system.slice                                loaded active active System Slice                               
user-1000.slice                             loaded active active User Slice of UID 1000                     
user-42.slice                               loaded active active User Slice of UID 42                       
user.slice                                  loaded active active User and Session Slice                     

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

13 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

CGroup hierarchies can be seen by using the systemd-cgls command:

[root@centos8 ~]# systemd-cgls
Control group /:
-.slice
├─user.slice
│ ├─user-42.slice
│ │ ├─session-c1.scope
│ │ │ ├─1317 gdm-session-worker [pam/gdm-launch-environment]
│ │ │ ├─1459 /usr/libexec/gdm-wayland-session --register-session gnome-session --autostart /usr/share/gdm/greeter/autostart
│ │ │ ├─1856 /usr/libexec/gnome-session-binary --autostart /usr/share/gdm/greeter/autostart
│ │ │ ├─1882 /usr/bin/gnome-shell
│ │ │ ├─2059 /usr/bin/Xwayland :1024 -rootless -terminate -accessx -core -listen 4 -listen 5 -displayfd 6
│ │ │ ├─2132 ibus-daemon --xim --panel disable
│ │ │ ├─2135 /usr/libexec/ibus-dconf
│ │ │ ├─2138 /usr/libexec/ibus-x11 --kill-daemon
│ │ │ ├─2251 /usr/libexec/gsd-xsettings
│ │ │ ├─2261 /usr/libexec/gsd-a11y-settings
│ │ │ ├─2268 /usr/libexec/gsd-clipboard
│ │ │ ├─2271 /usr/libexec/gsd-color
│ │ │ ├─2272 /usr/libexec/gsd-datetime
│ │ │ ├─2273 /usr/libexec/gsd-housekeeping
│ │ │ ├─2274 /usr/libexec/gsd-keyboard
│ │ │ ├─2275 /usr/libexec/gsd-media-keys
│ │ │ ├─2280 /usr/libexec/gsd-mouse
│ │ │ ├─2281 /usr/libexec/gsd-power
│ │ │ ├─2283 /usr/libexec/gsd-print-notifications
│ │ │ ├─2284 /usr/libexec/gsd-rfkill
│ │ │ ├─2285 /usr/libexec/gsd-screensaver-proxy
│ │ │ ├─2290 /usr/libexec/gsd-sharing
│ │ │ ├─2321 /usr/libexec/gsd-smartcard
│ │ │ ├─2328 /usr/libexec/gsd-sound
│ │ │ ├─2333 /usr/libexec/gsd-wacom
│ │ │ └─2432 /usr/libexec/ibus-engine-simple
│ │ └─user@42.service
│ │   ├─xdg-permission-store.service
│ │   │ └─2170 /usr/libexec/xdg-permission-store
│ │   ├─pulseaudio.service
│ │   │ └─1455 /usr/bin/pulseaudio --daemonize=no --log-target=journal
│ │   ├─init.scope
│ │   │ ├─1357 /usr/lib/systemd/systemd --user
│ │   │ └─1377 (sd-pam)
│ │   ├─at-spi-dbus-bus.service
│ │   │ ├─2090 /usr/libexec/at-spi-bus-launcher
│ │   │ ├─2095 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
│ │   │ └─2098 /usr/libexec/at-spi2-registryd --use-gnome-session
│ │   └─dbus.service
│ │     ├─1755 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
│ │     └─2143 /usr/libexec/ibus-portal
│ └─user-1000.slice
│   ├─user@1000.service
│   │ ├─gvfs-goa-volume-monitor.service
│   │ │ └─2369 /usr/libexec/gvfs-goa-volume-monitor
│   │ ├─xdg-permission-store.service
│   │ │ └─2191 /usr/libexec/xdg-permission-store
│   │ ├─tracker-store.service
│   │ │ └─2653 /usr/libexec/tracker-store
│   │ ├─evolution-calendar-factory.service
│   │ │ ├─2605 /usr/libexec/evolution-calendar-factory
│   │ │ └─2706 /usr/libexec/evolution-calendar-factory-subprocess --factory all --bus-name org.gnome.evolution.dataserver.Subprocess.Backend.Calendarx2605x2 --own-path /org/gnome/evolution>
│   │ ├─pulseaudio.service
│   │ │ └─1456 /usr/bin/pulseaudio --daemonize=no --log-target=journal
│   │ ├─gvfs-daemon.service
│   │ │ ├─1896 /usr/libexec/gvfsd
│   │ │ └─1901 /usr/libexec/gvfsd-fuse /run/user/1000/gvfs -f -o big_writes
│   │ ├─evolution-source-registry.service
│   │ │ └─2206 /usr/libexec/evolution-source-registry
│   │ ├─gvfs-udisks2-volume-monitor.service
│   │ │ └─2243 /usr/libexec/gvfs-udisks2-volume-monitor
│   │ ├─init.scope
│   │ │ ├─1239 /usr/lib/systemd/systemd --user
│   │ │ └─1318 (sd-pam)
│   │ ├─gvfs-gphoto2-volume-monitor.service
│   │ │ └─2269 /usr/libexec/gvfs-gphoto2-volume-monitor
│   │ ├─at-spi-dbus-bus.service
│   │ │ ├─1964 /usr/libexec/at-spi-bus-launcher
│   │ │ ├─1969 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
│   │ │ └─1972 /usr/libexec/at-spi2-registryd --use-gnome-session
│   │ ├─dbus.service
│   │ │ ├─1786 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
│   │ │ ├─2183 /usr/libexec/ibus-portal
│   │ │ ├─2201 /usr/libexec/gnome-shell-calendar-server
│   │ │ ├─2225 /usr/libexec/goa-daemon
│   │ │ ├─2397 /usr/libexec/goa-identity-service
│   │ │ └─2721 /usr/libexec/dconf-service
│   │ ├─evolution-addressbook-factory.service
│   │ │ ├─2727 /usr/libexec/evolution-addressbook-factory
│   │ │ └─2771 /usr/libexec/evolution-addressbook-factory-subprocess --factory all --bus-name org.gnome.evolution.dataserver.Subprocess.Backend.AddressBookx2727x2 --own-path /org/gnome/evo>
│   │ ├─gvfs-mtp-volume-monitor.service
lines 44-86

Using Systemd, several resources can be limited:

Important : You can check the systemd.resource-control(5) manual to see which CGroup parameters can be passed to systemctl.

Limiting Memory Usage

Start by creating the hello-world.sh script that will be used to work with CGroups :

[root@centos8 ~]# vi hello-world.sh
[root@centos8 ~]# cat hello-world.sh
#!/bin/bash
while [ 1 ]; do
        echo "hello world"
        sleep 360
done

Make the script runnable and test it:

[root@centos8 ~]# chmod u+x hello-world.sh
[root@centos8 ~]# ./hello-world.sh
hello world
^C

Now create a CGroup in the memory sub-system called helloworld :

[root@centos8 ~]# mkdir /sys/fs/cgroup/memory/helloworld

By default, this CGroup inherits the use of the all of the available memory. To avoid that, create a 40,000,000 Byte limit for this CGroup:

[root@centos8 ~]# echo 40000000 > /sys/fs/cgroup/memory/helloworld/memory.limit_in_bytes
[root@centos8 ~]# cat /sys/fs/cgroup/memory/helloworld/memory.limit_in_bytes
39997440

Important - Note that the 40,000,000 requested have become 39,997,440 which corresponds to a round number of Kernel Memory Pages, each of 4KB size ( 39,997,440 / 4,096 = 9,765 ).

Now run the helloworld.sh script:

[root@centos8 ~]# ./hello-world.sh &
[1] 35148

[root@centos8 ~]# hello world
[Enter] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<PUSH Enter Key

[root@centos8 ~]# ps aux | grep hello-world
root       35148  0.0  0.0  12724  2980 pts/1    S    08:48   0:00 /bin/bash ./hello-world.sh
root       35151  0.0  0.0  12136  1044 pts/1    S+   08:48   0:00 grep --color=auto hello-world

Note that there is no memory limit:

[root@centos8 ~]# ps -ww -o cgroup 35148
CGROUP
12:memory:/user.slice/user-1000.slice/session-7.scope,7:devices:/user.slice,4:pids:/user.slice/user-1000.slice/session-7.scope,2:blkio:/user.slice,1:name=systemd:/user.slice/user-1000.slice/session-7.scope

NOw insert the PID of the script into the helloworld CGroup:

[root@centos8 ~]# echo 35148 > /sys/fs/cgroup/memory/helloworld/cgroup.procs

NOw you can see a memory limit - 12:memory:/helloworld:

[root@centos8 ~]# ps -ww -o cgroup 35148
CGROUP
12:memory:/helloworld,7:devices:/user.slice,4:pids:/user.slice/user-1000.slice/session-7.scope,2:blkio:/user.slice,1:name=systemd:/user.slice/user-1000.slice/session-7.scope

Now check the actual memory consumption:

[root@centos8 ~]# cat /sys/fs/cgroup/memory/helloworld/memory.usage_in_bytes
274432

Kill the hello-world.sh script:

[root@centos8 ~]# kill 35148
[root@centos8 ~]# ps aux | grep hello-world
root       35307  0.0  0.0  12136  1112 pts/1    S+   08:55   0:00 grep --color=auto hello-world
[1]+  Terminated              ./hello-world.sh

Create a more restrictive CGroup called helloworld1 :

[root@centos8 ~]# mkdir /sys/fs/cgroup/memory/helloworld1
[root@centos8 ~]# echo 6000 > /sys/fs/cgroup/memory/helloworld1/memory.limit_in_bytes
[root@centos8 ~]# cat /sys/fs/cgroup/memory/helloworld1/memory.limit_in_bytes
4096

Re-run the script and put the PID in the new CGroup:

[root@centos8 ~]# ./hello-world.sh &
[1] 35389

[root@centos8 ~]# hello world
[Enter]

[root@centos8 ~]# echo 35389 > /sys/fs/cgroup/memory/helloworld1/cgroup.procs

Wait for hello world to appear. You will notice that the script has stopped:

[root@centos8 ~]# hello world
[Enter] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<PUSH Enter Key
[1]+  Killed                  ./hello-world.sh

The cgcreate Command

This command creates a CGroup:

[root@centos8 ~]# cgcreate -g memory:helloworld2
[root@centos8 ~]# ls -l /sys/fs/cgroup/memory/helloworld2/
total 0
-rw-rw-r--. 1 root root 0 Jul 13 10:39 cgroup.clone_children
--w--w----. 1 root root 0 Jul 13 10:39 cgroup.event_control
-rw-rw-r--. 1 root root 0 Jul 13 10:39 cgroup.procs
-rw-rw-r--. 1 root root 0 Jul 13 10:39 memory.failcnt
--w--w----. 1 root root 0 Jul 13 10:39 memory.force_empty
-rw-rw-r--. 1 root root 0 Jul 13 10:39 memory.kmem.failcnt
-rw-rw-r--. 1 root root 0 Jul 13 10:39 memory.kmem.limit_in_bytes
-rw-rw-r--. 1 root root 0 Jul 13 10:39 memory.kmem.max_usage_in_bytes
-r--r--r--. 1 root root 0 Jul 13 10:39 memory.kmem.slabinfo
-rw-rw-r--. 1 root root 0 Jul 13 10:39 memory.kmem.tcp.failcnt
-rw-rw-r--. 1 root root 0 Jul 13 10:39 memory.kmem.tcp.limit_in_bytes
-rw-rw-r--. 1 root root 0 Jul 13 10:39 memory.kmem.tcp.max_usage_in_bytes
-r--r--r--. 1 root root 0 Jul 13 10:39 memory.kmem.tcp.usage_in_bytes
-r--r--r--. 1 root root 0 Jul 13 10:39 memory.kmem.usage_in_bytes
-rw-rw-r--. 1 root root 0 Jul 13 10:39 memory.limit_in_bytes
-rw-rw-r--. 1 root root 0 Jul 13 10:39 memory.max_usage_in_bytes
-rw-rw-r--. 1 root root 0 Jul 13 10:39 memory.memsw.failcnt
-rw-rw-r--. 1 root root 0 Jul 13 10:39 memory.memsw.limit_in_bytes
-rw-rw-r--. 1 root root 0 Jul 13 10:39 memory.memsw.max_usage_in_bytes
-r--r--r--. 1 root root 0 Jul 13 10:39 memory.memsw.usage_in_bytes
-rw-rw-r--. 1 root root 0 Jul 13 10:39 memory.move_charge_at_immigrate
-r--r--r--. 1 root root 0 Jul 13 10:39 memory.numa_stat
-rw-rw-r--. 1 root root 0 Jul 13 10:39 memory.oom_control
----------. 1 root root 0 Jul 13 10:39 memory.pressure_level
-rw-rw-r--. 1 root root 0 Jul 13 10:39 memory.soft_limit_in_bytes
-r--r--r--. 1 root root 0 Jul 13 10:39 memory.stat
-rw-rw-r--. 1 root root 0 Jul 13 10:39 memory.swappiness
-r--r--r--. 1 root root 0 Jul 13 10:39 memory.usage_in_bytes
-rw-rw-r--. 1 root root 0 Jul 13 10:39 memory.use_hierarchy
-rw-rw-r--. 1 root root 0 Jul 13 10:39 notify_on_release
-rw-rw-r--. 1 root root 0 Jul 13 10:39 tasks

Set a memory limit for helloworld2:

[root@centos8 ~]# echo 40000000 > /sys/fs/cgroup/memory/helloworld2/memory.limit_in_bytes
The cgexec Command

This command inserts the limit into the CGroup and launches the script:

[root@centos8 ~]# cgexec -g memory:helloworld2 ./hello-world.sh &
[1] 37670

[root@centos8 ~]# hello world
[Enter]

[root@centos8 ~]# 
THe cgdelete Command

Once the sxcript has terminated, this command deletes the CGroup:

[root@centos8 ~]# ps aux | grep *.sh
root       37670  0.0  0.0  12724  3112 pts/1    S    10:41   0:00 /bin/bash ./hello-world.sh
root       37685  0.0  0.0  12136  1148 pts/1    S+   10:42   0:00 grep --color=auto hello-world.sh

[root@centos8 ~]# kill 37670

root@centos8 ~]# ps aux | grep *.sh
root       37726  0.0  0.0  12136  1156 pts/1    R+   10:43   0:00 grep --color=auto hello-world.sh
[1]+  Terminated              cgexec -g memory:helloworld2 ./hello-world.sh

[root@centos8 ~]# cgdelete memory:helloworld2

[root@centos8 ~]# ls -l /sys/fs/cgroup/memory/helloworld2/
ls: cannot access '/sys/fs/cgroup/memory/helloworld2/': No such file or directory
The /etc/cgconfig.conf File

In order for limites to be persistent, it is necessary to edit the /etc/cgconfig.conf file:

[root@centos8 ~]# vi /etc/cgconfig.conf
[root@centos8 ~]# cat /etc/cgconfig.conf
#
#  Copyright IBM Corporation. 2007
#
#  Authors:     Balbir Singh <balbir@linux.vnet.ibm.com>
#  This program is free software; you can redistribute it and/or modify it
#  under the terms of version 2.1 of the GNU Lesser General Public License
#  as published by the Free Software Foundation.
#
#  This program is distributed in the hope that it would be useful, but
#  WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
#
# By default, we expect systemd mounts everything on boot,
# so there is not much to do.
# See man cgconfig.conf for further details, how to create groups
# on system boot using this file.
group helloworld2 {
        cpu {
                cpu.shares = 100;
        }
        memory {
                memory.limit_in_bytes = 40000;
        }
}

Important - Here you have created two limits : a memory limit of 40,000 Bytes and a cpu.shares limoit of 100. This latter corresponds to about 9,77% of the CPU.

Now create the two CGroups:

[root@centos8 ~]# cgcreate -g memory:helloworld2
[root@centos8 ~]# ls -l /sys/fs/cgroup/memory/helloworld2/
total 0
-rw-rw-r--. 1 root root 0 Jul 13 10:46 cgroup.clone_children
--w--w----. 1 root root 0 Jul 13 10:46 cgroup.event_control
-rw-rw-r--. 1 root root 0 Jul 13 10:46 cgroup.procs
-rw-rw-r--. 1 root root 0 Jul 13 10:46 memory.failcnt
--w--w----. 1 root root 0 Jul 13 10:46 memory.force_empty
-rw-rw-r--. 1 root root 0 Jul 13 10:46 memory.kmem.failcnt
-rw-rw-r--. 1 root root 0 Jul 13 10:46 memory.kmem.limit_in_bytes
-rw-rw-r--. 1 root root 0 Jul 13 10:46 memory.kmem.max_usage_in_bytes
-r--r--r--. 1 root root 0 Jul 13 10:46 memory.kmem.slabinfo
-rw-rw-r--. 1 root root 0 Jul 13 10:46 memory.kmem.tcp.failcnt
-rw-rw-r--. 1 root root 0 Jul 13 10:46 memory.kmem.tcp.limit_in_bytes
-rw-rw-r--. 1 root root 0 Jul 13 10:46 memory.kmem.tcp.max_usage_in_bytes
-r--r--r--. 1 root root 0 Jul 13 10:46 memory.kmem.tcp.usage_in_bytes
-r--r--r--. 1 root root 0 Jul 13 10:46 memory.kmem.usage_in_bytes
-rw-rw-r--. 1 root root 0 Jul 13 10:46 memory.limit_in_bytes
-rw-rw-r--. 1 root root 0 Jul 13 10:46 memory.max_usage_in_bytes
-rw-rw-r--. 1 root root 0 Jul 13 10:46 memory.memsw.failcnt
-rw-rw-r--. 1 root root 0 Jul 13 10:46 memory.memsw.limit_in_bytes
-rw-rw-r--. 1 root root 0 Jul 13 10:46 memory.memsw.max_usage_in_bytes
-r--r--r--. 1 root root 0 Jul 13 10:46 memory.memsw.usage_in_bytes
-rw-rw-r--. 1 root root 0 Jul 13 10:46 memory.move_charge_at_immigrate
-r--r--r--. 1 root root 0 Jul 13 10:46 memory.numa_stat
-rw-rw-r--. 1 root root 0 Jul 13 10:46 memory.oom_control
----------. 1 root root 0 Jul 13 10:46 memory.pressure_level
-rw-rw-r--. 1 root root 0 Jul 13 10:46 memory.soft_limit_in_bytes
-r--r--r--. 1 root root 0 Jul 13 10:46 memory.stat
-rw-rw-r--. 1 root root 0 Jul 13 10:46 memory.swappiness
-r--r--r--. 1 root root 0 Jul 13 10:46 memory.usage_in_bytes
-rw-rw-r--. 1 root root 0 Jul 13 10:46 memory.use_hierarchy
-rw-rw-r--. 1 root root 0 Jul 13 10:46 notify_on_release
-rw-rw-r--. 1 root root 0 Jul 13 10:46 tasks
[root@centos8 ~]# cgcreate -g cpu:helloworld2
[root@centos8 ~]# ls -l /sys/fs/cgroup/cpu/helloworld2/
total 0
-rw-rw-r--. 1 root root 0 Jul 13 10:47 cgroup.clone_children
-rw-rw-r--. 1 root root 0 Jul 13 10:47 cgroup.procs
-r--r--r--. 1 root root 0 Jul 13 10:47 cpuacct.stat
-rw-rw-r--. 1 root root 0 Jul 13 10:47 cpuacct.usage
-r--r--r--. 1 root root 0 Jul 13 10:47 cpuacct.usage_all
-r--r--r--. 1 root root 0 Jul 13 10:47 cpuacct.usage_percpu
-r--r--r--. 1 root root 0 Jul 13 10:47 cpuacct.usage_percpu_sys
-r--r--r--. 1 root root 0 Jul 13 10:47 cpuacct.usage_percpu_user
-r--r--r--. 1 root root 0 Jul 13 10:47 cpuacct.usage_sys
-r--r--r--. 1 root root 0 Jul 13 10:47 cpuacct.usage_user
-rw-rw-r--. 1 root root 0 Jul 13 10:47 cpu.cfs_period_us
-rw-rw-r--. 1 root root 0 Jul 13 10:47 cpu.cfs_quota_us
-rw-rw-r--. 1 root root 0 Jul 13 10:47 cpu.rt_period_us
-rw-rw-r--. 1 root root 0 Jul 13 10:47 cpu.rt_runtime_us
-rw-rw-r--. 1 root root 0 Jul 13 10:47 cpu.shares
-r--r--r--. 1 root root 0 Jul 13 10:47 cpu.stat
-rw-rw-r--. 1 root root 0 Jul 13 10:47 notify_on_release
-rw-rw-r--. 1 root root 0 Jul 13 10:47 tasks
The cgconfigparser Command

Apply the contents of the /etc/cgconfig.conf file using the cgconfigparser command:

[root@centos8 ~]# cgconfigparser -l /etc/cgconfig.conf
[root@centos8 ~]# cat /sys/fs/cgroup/memory/helloworld2/memory.limit_in_bytes
36864
[root@centos8 ~]# cat /sys/fs/cgroup/cpu/helloworld2/cpu.shares
100

Copyright © 2021 Hugh Norris.