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보다 성능이 떨어집니다.

* CPU와 메모리를 합쳐서 Node라고 부릅니다.
* 하이퍼스레딩
CPU의 작업 대기시간을 시분할로 활용하여 CPU의 처리량을 개선하는 Intel의 기술입니다.
### 하이퍼스레딩 on/off 확인
# dmidecode -t processor | grep HTT
HTT (Multi-threading)
HTT (Multi-threading)

커널 변수 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 : 디바이스에 의한 패킷 드롭 개수
* 메인보드 소켓에 따른 PCI 정보
제조사마다 차이가 있겠지만 HP의 경우 아래와 같은 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
1 = HDD
- 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에서 확인해야 합니다.
'System Engineering > Linux' 카테고리의 다른 글
[커널이야기] 리눅스 메모리 1 - 메모리를 확인하는 방법과 slab/swap 메모리 (2) | 2023.06.15 |
---|---|
[커널이야기] Load Average로 시스템 콜 추적하기 (0) | 2023.06.09 |
폐쇄망 환경에서 휴대폰 테더링으로 yum/apt 사용하기 (0) | 2023.04.20 |
[커널이야기] Linux top 명령어와 프로세스 (0) | 2023.04.13 |
Rhel7.7/KVM에 PCI-Passthrough/SR-IOV 설정하기 (0) | 2021.02.19 |