System Engineering/Linux

[커널이야기] Linux 시스템의 구성 정보 확인하기 - BIOS / CPU / NUMA / NIC / DISK

Hopulence 2023. 4. 11. 17:24

 On-premise에서 Cloud를 운영하는 System Engineer로서 실무에서 발생한 문제를 해결하기 위해서 전전긍긍하던 중 아주 유용한 책을 발견하여 공부하고 정리하기 위해서 글을 쓰게 되었습니다. 좋은 책을 써주신 저자님께 감사드립니다:)

http://www.yes24.com/Product/Goods/44376723

 

DevOps와 SE를 위한 리눅스 커널 이야기 - YES24

커널은 오랜 세월 기능이 추가되고 개선되어 오면서 완벽하게 이해하기 힘들 정도로 방대해졌다. 하지만 변하지 않는 기본 기능들이 있다. 이런 근간이 되는 기능에 대한 이해를 바탕으로 시스

www.yes24.com

 

목차

- 커널 확인 방법

- BIOS / CPU / NUMA + 하이퍼스레딩 확인 방법 

- Memory / NIC 확인 방법

- Disk 확인 방법


 

  • 커널 버전 확인하기
# uname -a

Linux ... 4.15.0-162-generic #170~16.04.1-Ubuntu SMP Tue Oct 26 08:03:56 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

  시스템의 커널 버전은 4.15.0-162-generic 이고 x86계열의 64bit OS를 사용하고 있습니다.

 

  • 커널 변수 확인하기
# cat /proc/cmdline

BOOT_IMAGE=/vmlinuz-4.15.0-162-generic root=/dev/mapper/os-root ro audit=1 console=tty0 \
console=ttyS0,115200 net.ifnames=0 biosdevname=0 rootdelay=90 nomodeset crashkernel=256M \
intel_idle.max_cstate=1 processor.max_cstate=1 idle=halt \
isolcpus=1,21,41,61,3-19,23-39,43-59,63-79 nohz_full=1,21,41,61 \
hugepagesz=2M hugepages=2048 hugepagesz=1G hugepages=348 default_hugepagesz=1G \
transparent_hugepage=never intel_iommu=on iommu=pt quiet splash vt.handoff=7

-  crashkernel=256M

: 커널이 패닉에 빠졌을 때 디버깅 정보를 저장하기 위해 미리 예약할 메모리를 설정할 수 있습니다. (kdump)

 

- intel_idle.max_cstate=1

 : C-State는 작업이 스케쥴되지 않은 CPU Core를 유휴상태로 만들어 컴퓨팅 전력을 아끼는 옵션입니다. 그러나 서버의 Traffic이나 Transaction의 갑작스런 급증으로 Core를 다시 가동해야 하는 경우 성능 저하가 발생할 수 있습니다.

C-State 옵션을 BIOS에서 끄더라도 소프트웨어 모듈에 의해 다시 켜지는 경우가 있기 때문에, 사용하지 않으려면 값을 0으로 설정해야 합니다.

 

  • 커널 부팅 메세지 확인하기 - dmesg
# dmesg | grep -i kernel

[    0.000000] Reserving 256MB of memory at 528MB for crashkernel (System RAM: 392891MB)
[    0.000000] Booting paravirtualized kernel on bare hardware
[    0.000000] Kernel command line: BOOT_IMAGE=/vmlinuz-4.15.0-162-generic root=/dev/mapper/os-root ro audit=1 console=tty0 console=ttyS0,115200 net.ifnames=0 biosdevname=0 rootdelay=90 nomodeset crashkernel=256M intel_idle.max_cstate=1 processor.max_cstate=1 idle=halt isolcpus=1,21,41,61,3-19,23-39,43-59,63-79 nohz_full=1,21,41,61 hugepagesz=2M hugepages=2048 hugepagesz=1G hugepages=348 default_hugepagesz=1G transparent_hugepage=never intel_iommu=on iommu=pt quiet splash vt.handoff=7
 ### 부팅 시 사용한 커널 파라미터.

[    0.000000] Memory: 30701776K/402321268K available (12300K kernel code, 2482K rwdata, 4268K rodata, 2448K init, 2724K bss, 371619492K reserved, 0K cma-reserved)
 ### 부팅시 커널이 인식하는 메모리 정보이며, 부팅 완료후 메모리를 반환하기 때문에 free와 다를 수 있습니다.
                (물리 메모리 크기 / 실제 사용 가능한 메모리 크기)
                
[    0.000000] mempolicy: Enabling automatic NUMA balancing. Configure with numa_balancing= or the kernel.numa_balancing sysctl
...

 

  • 커널 컴파일 정보 확인하기
# cat /boot/config-`uname -r` | more

#
# Automatically generated file; DO NOT EDIT.
# Linux/x86 4.15.0-162-generic Kernel Configuration
#
CONFIG_64BIT=y
CONFIG_X86_64=y
CONFIG_X86=y
CONFIG_INSTRUCTION_DECODER=y
CONFIG_OUTPUT_FORMAT="elf64-x86-64"

...

CONFIG_FUNCTION_TRACER=y   <<<

 커널 기능 중 컴파일 옵션에 포함되어야만 사용 가능한 기능도 있다.  ftrace와 같이 커널 함수 레벨의 추적이 필요한 경우 'CONFIG_FUNCTUIN_TRACER'와 같은 몇몇 옵션이 컴파일에 포함되어야 합니다. 

 


  • 장비 제조사 확인하기
# dmidecode -t system

Handle 0x008E, DMI type 1, 27 bytes
System Information
        Manufacturer: HPE				<<<
        Product Name: ProLiant DL380 Gen10		<<<
        Version: Not Specified
		...

 

  • BIOS 정보 확인하기
# dmidecode -t bios

Handle 0x0003, DMI type 0, 26 bytes
BIOS Information
        Vendor: HPE
        Version: U30				<<<
        Release Date: 01/23/2021
        Address: 0xF0000
        Runtime Size: 64 kB
        ROM Size: 64 MB
        Characteristics:
				...
                Function key-initiated network boot is supported
                Targeted content distribution is supported
                UEFI is supported
        BIOS Revision: 2.42			<<<
        Firmware Revision: 2.41			<<<

 

  • CPU 정보 확인하기
# lscpu

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                80			<<< 논리적 코어 개수
On-line CPU(s) list:   0-79
Thread(s) per core:    2			<<< Intel의 하이퍼스레딩으로 CPU sibling 
Core(s) per socket:    20			<<< CPU 소켓당 코어 개수
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 85
Model name:            Intel(R) Xeon(R) Gold 6248 CPU @ 2.50GHz		<<< CPU 모델명
Stepping:              7
CPU MHz:               2500.000
BogoMIPS:              5001.95
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              1024K
L3 cache:              28160K
NUMA node0 CPU(s):     0-19,40-59
NUMA node1 CPU(s):     20-39,60-79

 

 * NUMA (Non-Uniform Memory Access)와 CPU Pinning

 

서버 단면도

 

 멀티 프로세서 시스템에서는 기본적으로 2개의 CPU가 사용되곤 합니다. 오른쪽 그림과 같이 각가의 CPU마다 별도의 메모리가 있습니다.

 CPU가 QPI(Quick Path Interconnect)를 거치지 않고 자신의 메모리에 접근하는 방식을 Local Access(1 Hop), QPI를 거쳐 다른 NUMA(Node)의 메모리에 접근하는 것을 Remote Access(2 Hop)라고 합니다. 

 Remote Access의 경우 다른 NUMA를 건너서 접근해야 하기 때문에, Local Access보다 성능이 떨어집니다.

 

 

 

 

 

 

 

 

NUMA와 Physical 구조

 * CPU와 메모리를 합쳐서 Node라고 부릅니다.

 

 

 * 하이퍼스레딩 

CPU의 작업 대기시간을 시분할로 활용하여 CPU의 처리량을 개선하는 Intel의 기술입니다.

### 하이퍼스레딩 on/off 확인
# dmidecode -t processor | grep HTT
                HTT (Multi-threading)
                HTT (Multi-threading)

 

VM 2개를 Hosting하는 서버의 Logcal CPU 형상

 커널 변수 isolcpus 옵션으로 프로세스를 특정 CPU에 pinning 할 수 있습니다. 이를 통해서 프로세스 간 CPU 경쟁을 최소화할 수 있습니다.

root@compute-1-2:~# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-4.15.0-162-generic root=/dev/mapper/os-root ro audit=1 ...
isolcpus=1,21,41,61,2-19,22-39,42-59,62-79 nohz_full=1,21,41,61 hugepagesz=2M hugepages=2048 hugepagesz=1G hugepages=348 default_hugepagesz=1G transparent_hugepage=never intel_iommu=on iommu=pt quiet splash vt.handoff=7

 

 KVM/QEMU로 1개의 Guest VM을 NUMA 0 에 있는 CPU core만을 사용하도록 설정한 결과입니다.

# 특정 프로세스에 허용된 CPU 코어로 NUMA 확인할 수 있습니다.
root@compute-1-2:~# cat /proc/35599/status
Name:   qemu-system-x86
Umask:  0002
State:  S (sleeping)
Tgid:   35599
Ngid:   0
Pid:    35599
PPid:   1
...
Cpus_allowed:   0000,0ffff800,000ffff8
Cpus_allowed_list:      3-19,43-59

 

root@compute-1-2:~# cat /proc/37854 /status
Name:   sds-3.5.1300.11
Umask:  0000
State:  S (sleeping)
Tgid:   37854
Ngid:   0
Pid:    37854
PPid:   1
...
Cpus_allowed:   0000,50000500,00500005
Cpus_allowed_list:      0,2,20,22,40,42,60,62

 

 


  • 메모리 제조사와 타입 확인하기
# dmidecode -t memory | more

Memory Device
        Array Handle: 0x0013
        Error Information Handle: Not Provided
        Total Width: 72 bits
        Data Width: 64 bits
        Size: 32 GB				<<< 메모리 칩의 용량
        Form Factor: DIMM
        Set: 4
        Locator: PROC 1 DIMM 5
        Bank Locator: Not Specified
        Type: DDR4				<<< 메모리 칩의 타입 
        Type Detail: Synchronous Registered (Buffered)
        Speed: 2933 MHz
        Manufacturer: HPE			<<< 메모리 칩의 제조사
        Serial Number: Not Specified
        Asset Tag: Not Specified
        ...

 

  • 물리 메모리 확인하기
# dmidecode -t memory | grep -i size | grep -v "No Module Installed"
        Size: 32 GB
        Size: 32 GB
        Size: 32 GB
        Size: 32 GB
        Size: 32 GB
        Size: 32 GB
        Size: 32 GB
        Size: 32 GB
        Size: 32 GB
        Size: 32 GB
        Size: 32 GB
        Size: 32 GB

# dmidecode -t memory | grep -i size | grep -v "No Module Installed" | wc -l
12

### 32GB 메모리가 12개 장착된 시스템

 


  • NIC 제조사와 모델 확인하기
# lspci | grep –i ethernet
02:00.0 Ethernet controller: Broadcom Inc. and subsidiaries NetXtreme BCM5719 Gigabit Ethernet PCIe (rev 01)
02:00.1 Ethernet controller: Broadcom Inc. and subsidiaries NetXtreme BCM5719 Gigabit Ethernet PCIe (rev 01)
02:00.2 Ethernet controller: Broadcom Inc. and subsidiaries NetXtreme BCM5719 Gigabit Ethernet PCIe (rev 01)
02:00.3 Ethernet controller: Broadcom Inc. and subsidiaries NetXtreme BCM5719 Gigabit Ethernet PCIe (rev 01)
12:00.0 Ethernet controller: Intel Corporation Ethernet Controller XXV710 for 25GbE SFP28 (rev 02)
12:00.1 Ethernet controller: Intel Corporation Ethernet Controller XXV710 for 25GbE SFP28 (rev 02)

 

  • NIC의 최대 대역폭과 스위치와 Nego 된 대역폭 확인하기
# ethtool ens1f0
Settings for ens1f0:
        Supported ports: [ FIBRE ]
        Supported link modes:   25000baseCR/Full
        Supported pause frame use: Symmetric Receive-only
        Supports auto-negotiation: Yes				<<<
        Supported FEC modes: None        RS      BASER
        Advertised link modes:  25000baseCR/Full		<<< 네트워크 장비와 Nego된 대역폭
        Advertised pause frame use: No
        Advertised auto-negotiation: Yes
        Advertised FEC modes: None       RS      BASER
        Speed: 25000Mb/s					<<< NIC에서 지원하는 대역폭
        Duplex: Full
        Auto-negotiation: off					<<<
        Port: Direct Attach Copper
        PHYAD: 0
        Transceiver: internal
        Supports Wake-on: d
        Wake-on: d

 

  • NIC의 드라이버와 펌웨어 정보
# ethtool -i ens1f0

driver: i40e					<<< OS와 상호작용 하기 위한 NIC의 드라이버 종류 (Intel 40G)
version: 2.16.11				<<< 드라이버의 버전
firmware-version: 8.50 0x8000b708 1.3082.0	<<< NIC의 ROM에 
expansion-rom-version:
bus-info: 0000:12:00.0				<<< NIC이 장착된 메인보드의 PCI 주소
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes

 

  • SFP 광모듈 정보 (광레벨 확인)
# ethtool -m enp59s0f1
        Identifier                                : 0x03 (SFP)
        Extended identifier                       : 0x04 (GBIC/SFP defined by 2-wire interface ID)
        Connector                                 : 0x07 (LC)
        Transceiver codes                         : 0x10 0x00 0x00 0x00 0x40 0x40 0x04 0x00 0x02
        Transceiver type                          : 10G Ethernet: 10G Base-SR
        Transceiver type                          : FC: short distance (S)
        Transceiver type                          : FC: Shortwave laser w/o OFC (SN)
        Transceiver type                          : FC: Multimode, 50um (M5)
        Transceiver type                          : Extended: 100G Base-SR4 or 25GBase-SR
        ...
        Optical diagnostics support               : Yes
        Laser bias current                        : 6.200 mA
        Laser output power                        : 0.7896 mW / -1.03 dBm		<<< Tx 
        Receiver signal average optical power     : 0.5259 mW / -2.79 dBm		<<< Rx
        Module temperature                        : 40.66 degrees C / 105.18 degrees F
        Module voltage                            : 3.2621 V

 

  • NIC 통계 수치 확인
# ethtool -S enp59s0f1 | egrep 'fault|down|drop|error'
     rx_errors: 0
     tx_errors: 0
     rx_dropped: 0
     tx_dropped: 0
     rx_length_errors: 0
     rx_crc_errors: 0
     port.tx_errors: 0
     port.rx_dropped: 0
     port.tx_dropped_link_down: 0
     port.rx_crc_errors: 0
     port.mac_local_faults: 0
     port.mac_remote_faults: 0
     port.rx_length_errors: 0
  • port.mac_local/remote_faults : OSI의 L1 fault 횟수
  • port.tx_dropped_link_down : link-down으로 발생한 패킷 드롭 개수
  • rx/tx_dropped : 드라이버에 의한 패킷 드롭 개수
  • port.rx/tx_dropped : 디바이스에 의한 패킷 드롭 개수

Intel Reference

AMD Reference

 

 * 메인보드 소켓에 따른 PCI 정보

 제조사마다 차이가 있겠지만 HP의 경우 아래와 같은 PCI 주소를 가지고 있습니다.

HP Gen의 NIC 소켓과 PCI 주소

 

Dell R640의 NIC 소켓과 PCI 주소

 

  • NIC의 링 버퍼 크기 확인
# ethtool -g ens1f0

Ring parameters for ens1f0:
Pre-set maximums:		<<< NIC의 최대 링 버퍼 값
RX:             4096
RX Mini:        n/a
RX Jumbo:       n/a
TX:             4096
Current hardware settings:	<<< 현재 링 버퍼 설정 값
RX:             512
RX Mini:        n/a
RX Jumbo:       n/a
TX:             512

### 링 버퍼의 현재값이 최대값보다 작다면 네트워크 성능이 저하되므로 
### maximums과 current의 값이 같도록 설정하는 것이 좋습니다.
### 'ethtool -G ens1f0 rx 4096 tx 4096'과 같은 명령어로 변경 가능합니다.

 

  • NIC의 기능 옵션 확인하기
# ethtool -k ens1f0

Features for ens1f0:
rx-checksumming: on
tx-checksumming: on
        tx-checksum-ipv4: on
        tx-checksum-ip-generic: off [fixed]
        tx-checksum-ipv6: on
        tx-checksum-fcoe-crc: off [fixed]
        tx-checksum-sctp: on
scatter-gather: on
        tx-scatter-gather: on
        tx-scatter-gather-fraglist: off [fixed]
tcp-segmentation-offload: on
        tx-tcp-segmentation: on
        tx-tcp-ecn-segmentation: on
        tx-tcp-mangleid-segmentation: off
        tx-tcp6-segmentation: on
generic-segmentation-offload: on		<<< TCP-Offload
generic-receive-offload: off

 * TCP-Offload

 MTU 이상의 패킷에 Fragmentation이 발생하는 경우 CPU가 아닌 NIC에서 직접 수행하도록 합니다. 이 기능으로 CPU의 부하를 줄여 패킷 처리량을 늘릴 수 있지만, 패킷이 유실될 수 있으므로 유의해서 사용해야 합니다.

 


  • Disk 파티션 정보 확인하기
# df -h

Filesystem                   Size  Used Avail Use% Mounted on
udev                          15G     0   15G   0% /dev
tmpfs                        256M  149M  108M  59% /run
/dev/mapper/os-root           50G  2.0G   45G   5% /
tmpfs                         12G     0   12G   0% /dev/shm
tmpfs                        5.0M     0  5.0M   0% /run/lock
tmpfs                        189G     0  189G   0% /sys/fs/cgroup
/dev/sda3                    392M  100M  273M  27% /boot
/dev/mapper/data-collection  976M  1.3M  908M   1% /data_collection
/dev/mapper/crashes-crash     30G   44M   28G   1% /var/crash
/dev/mapper/logs-log         9.8G  389M  8.9G   5% /var/log
/dev/mapper/vm-nova          1.7T   16G  1.6T   1% /var/lib/nova
tmpfs                        128M     0  128M   0% /run/user/0

 

  • Disk의 종류(HDD, SSD)와 세부 사항 확인하기
# lsblk -o name,rota,size,sched,type,MOUNTPOINT,FSTYPE
NAME                ROTA   SIZE SCHED TYPE MOUNTPOINT       FSTYPE
sdb                    0 894.3G cfq   disk                        
├─sdb2                 0   200M cfq   part
├─sdb3                 0 893.3G cfq   part                  LVM2_member
│ └─vm-nova            0   1.7T       lvm  /var/lib/nova    ext4
└─sdb1                 0    24M cfq   part
sda                    0 894.3G cfq   disk                         
├─sda4                 0  50.1G cfq   part                  LVM2_member
│ └─os-root            0    50G       lvm  /                ext4
├─sda2                 0   200M cfq   part
├─sda9                 0    20M cfq   part
├─sda7                 0   1.1G cfq   part                  LVM2_member
│ └─data-collection    0     1G       lvm  /data_collection ext4
├─sda5                 0  10.1G cfq   part                  LVM2_member
│ └─logs-log           0    10G       lvm  /var/log         ext4
├─sda3                 0   400M cfq   part /boot            ext2
├─sda1                 0    24M cfq   part
├─sda8                 0 802.3G cfq   part                  LVM2_member
│ └─vm-nova            0   1.7T       lvm  /var/lib/nova    ext4
└─sda6                 0  30.1G cfq   part                  LVM2_member
  └─crashes-crash      0    30G       lvm  /var/crash       ext4
  
  ### 위 시스템은 2TB의 논리 볼륨을 사용하고 있습니다.
  ### I/O 스케쥴링위해 CFQ(Completely Fair Queueing) 스케쥴러를 사용합니다.

* ROTA(Rotational) 값으로 디스크 종류를 확인할 수 있습니다.

  0 = SSD, NVMe

  1 = HDD 

 

 * SSD(ATA), NVMe 구분

# lshw -class disk
memory
  *-disk:0
       description: ATA Disk
       product: INTEL SSDSC2KB07
       ...

 

 

  • RAID 컨트롤러 확인하기
# lshw -C storage

  *-storage
       description: Serial Attached SCSI controller
       product: Smart Storage PQI 12G SAS/PCIe 3		<<< RAID Controller
       vendor: Adaptec
       physical id: 0
       bus info: pci@0000:5c:00.0
       logical name: scsi0
       version: 01
       ...
  *-raid
       description: RAID bus controller
       product: MegaRAID SAS-3 3108 [Invader]	<<<
       vendor: Broadcom / LSI
       physical id: 0
       bus info: pci@0000:50:00.0
       version: 02
       width: 64 bits
       clock: 33MHz
       ...

 

  • 물리 Disk의 모델명 / 시리얼 넘버 / 펌웨어 확인하기
# smartctl -x /dev/sda

=== START OF INFORMATION SECTION ===
Device Model:     VK000960GWSXH					<<<
Serial Number:    xxxx....					<<<
LU WWN Device Id: 5 00a075 1234c1e52
Firmware Version: HPG2
User Capacity:    960,197,124,096 bytes [960 GB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    Solid State Device				<<<
Form Factor:      2.5 inches
TRIM Command:     Available, deterministic, zeroed
...

 

# MegaRAID
# storcli64 /c0 show all

...
-----------------------------------------------------------------------------
DG Arr Row EID:Slot DID Type  State BT       Size PDC  PI SED DS3  FSpace TR
-----------------------------------------------------------------------------
 0 -   -   -        -   RAID1 Optl  N  446.625 GB dflt N  N   none N      N
 0 0   -   -        -   RAID1 Optl  N  446.625 GB dflt N  N   none N      N
 0 0   0   252:1    8   DRIVE Onln  N  446.625 GB dflt N  N   none -      N
 0 0   1   252:0    15  DRIVE Onln  N  446.625 GB dflt N  N   none -      N
-----------------------------------------------------------------------------
...

 

* 시스템에서 출력되는 디스크의 정보는 RAID가 구성된 Logical Volume이며, RAID 정보를 확인하기 위해서는 하드웨어 벤더에서 제공되는 툴이나 mdadm 툴을 사용해야 합니다.

 물리 디스크와 RAID의 정확한 정보를 확인하려면 BIOS 또는 iDrac, iLO와 같은 IPMI에서 확인해야 합니다.