시스템 구성 정보 확인하기
아래 내용은 DevOps와 SE를 위한 리눅스 커널 이야기 1장 시스템 구성 정보 확인하기를 읽고 정리한 내용입니다. 먼저, 아래 실습을 위해서 VirtualBox 7 버전을 사용해서 vagrant로 가상 머신을 생성 후 실행하였습니다. 생성한 가상머신은 브릿지 어댑터로 실행하여 호스트 PC와 동등한 수준으로 네트워크를 구성하였습니다.
커널 정보 확인
vagrant@ubuntu-xenial:~$ uname -a
Linux ubuntu-xenial 4.4.0-210-generic #242-Ubuntu SMP Fri Apr 16 09:57:56 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
dmesg
dmesg로 아래 세 가지를 확인할 수 있습니다.
- 커널이 메모리를 인식하는 과정
- 하드웨어를 인식하고 드라이브를 올리는 과정
- 부팅 시 적용된 커널 파라미터
vagrant@ubuntu-xenial:~$ dmesg | grep -i kernel | more
[ 0.000000] KERNEL supported cpus:
[ 0.000000] Booting paravirtualized kernel on KVM
[ 0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-210-generic root=LABEL=cloudimg-rootfs ro console=tty1 conso
le=ttyS0
[ 0.000000] Memory: 4028304K/4193848K available (8644K kernel code, 1332K rwdata, 4044K rodata, 1492K init, 1164K bss, 16554
4K reserved, 0K cma-reserved)
[ 0.000000] Kernel/User page tables isolation: enabled
[ 2.710065] Loaded X.509 cert 'Build time autogenerated kernel key: cf00e047681d67edb2720680708b7d9498083038'
[ 2.811924] Freeing unused kernel memory: 1492K
[ 2.823829] Write protecting the kernel read-only data: 14336k
[ 2.829332] Freeing unused kernel memory: 1584K
[ 2.832975] Freeing unused kernel memory: 52K
[ 7.177889] systemd[1]: Listening on udev Kernel Socket.
[ 7.277415] systemd[1]: Starting Create list of required static device nodes for the current kernel...
[ 7.295831] systemd[1]: Starting Load Kernel Modules...
[ 7.401273] systemd[1]: Started Create list of required static device nodes for the current kernel.
책 본문에는 crashkernel과 intel_idle.max_cstate가 포함되어 있으나 위에서 Virtualbox로 생성한 가상화 서버에는 해당 내용이 없었습니다.
cstate과 관련해서는 최근에 사용되는 CPU에 포함된 C-State라는 옵션을 말하며 특별한 작업이 없는 Idle 상태가 되면 일부 CPU 코어를 잠자기 모드로 전환시키는데 갑자기 많은 코어가 필요한 경우 잠자기 모드인 코어를 다시 가동시켜야 하기 때문에 성능 저하가 발생하게 됩니다. 이러한 성능 저하를 피하기 위해 부팅 시 파라미터로 intel_idle 모듈을 사용하지 않도록 설정하는 것이 필요하다고 합니다.
커널 컴파일 정보 확인하기
cat /boot/config-`uname -r` | more
Bios 버전 확인하기
vagrant@ubuntu-xenial:~$ sudo dmidecode -t bios
# dmidecode 3.0
Getting SMBIOS data from sysfs.
SMBIOS 2.5 present.
Handle 0x0000, DMI type 0, 20 bytes
BIOS Information
Vendor: innotek GmbH
Version: VirtualBox
Release Date: 12/01/2006
Address: 0xE0000
Runtime Size: 128 kB
ROM Size: 128 kB
Characteristics:
ISA is supported
PCI is supported
Boot from CD is supported
Selectable boot is supported
8042 keyboard services are supported (int 9h)
CGA/mono video services are supported (int 10h)
ACPI is supported
장치의 모델명과 제조사 확인하기
- 모델명을 통해서 해당 장비가 어느 정도의 성능을 낼 수 있는지 확인 가능
vagrant@ubuntu-xenial:~$ sudo dmidecode -t system
# dmidecode 3.0
Getting SMBIOS data from sysfs.
SMBIOS 2.5 present.
Handle 0x0001, DMI type 1, 27 bytes
System Information
Manufacturer: innotek GmbH
Product Name: VirtualBox
Version: 1.2
Serial Number: 0
UUID: E6EBB279-7E47-034E-ACBD-CBCD56378872
Wake-up Type: Power Switch
SKU Number: Not Specified
Family: Virtual Machine
장비의 CPU 정보 확인하기
dmidecode -t processor
위 명령어 외에도 아래 명령어로 확인 가능
vagrant@ubuntu-xenial:~$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 158
model name : Intel(R) Core(TM) i7-8850H CPU @ 2.60GHz
stepping : 10
cpu MHz : 2601.612
cache size : 9216 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 22
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 rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc tsc_known_freq pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single kaiser fsgsbase bmi1 avx2 bmi2 invpcid rdseed clflushopt md_clear flush_l1d arch_capabilities
bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit srbds
bogomips : 5203.22
clflush size : 64
cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
...(생략)
- processor: 프로세서의 번호
- vendor_id: 프로세서 제조사
- cpu family: 프로세서의 패밀리 번호, 이는 프로세서의 구조나 세대를 대표
- model: 프로세서 모델 번호
- model name: 프로세서의 전체 모델 이름
- stepping: 제조 과정에서의 리비전 번호
- microcode: 프로세서의 마이크로코드 버전
- cpu MHz: 현재 프로세서의 클럭 속도 (MHz)
- cache size: 프로세서의 캐시 크기 (KB)
- physical id: 물리적 프로세서 ID
- siblings: 같은 물리적 프로세서 내의 코어 수
- core id: 현재 코어의 ID
- cpu cores: 실제 코어 수
- apicid: Advanced Programmable Interrupt Controller ID
- initial apicid: 부팅 시점의 APIC ID
- fpu: Floating Point Unit의 존재 여부
- FPU: 컴퓨터의 프로세서 내부에 포함된 하드웨어 컴포넌트로 부동소수점 연산(실수 연산)을 빠르게 수행하기 위해 설계
- fpu_exception: FPU 예외처리 지원 여부
- cpuid level: CPUID 명령어의 최대 레벨
- wp: Write Protect 비트 지원 여부
- Write Protect 비트는 x86 아키텍처의 컨트롤 레지스터 CRO의 한 비트로서 메모리 페이지를 쓰기 방지하기 위해 사용됩니다. WP 비트가 설정되면 운영 체제는 읽기 전용으로 표시된 페이지를 보호할 수 있게 됩니다.
- WP 비트의 주요 목적과 이유
- 메모리 보호, 잘못된 메모리 접근 방지, 보안
- flags: 프로세서가 지원하는 기능 및 확장 명령어 집합
- bugs: 알려진 프로세서 취약점
- bogomips: 예전에는 프로세서 성능의 대략적인 지표로 사용되었지만, 현대에는 큰 의미가 없는 값
- clflush size: CLFLUSH 명령어를 사용하여 플러시할 때의 단위 크기
- cache_alignment: 프로세서 캐시의 정렬 요구 사항
- address sizes: 물리적 및 가상 주소의 크기
- power management: 프로세서의 전력 관리 기능
vagrant@ubuntu-xenial:~$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1 # 하이퍼 스레딩 비활성화
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 158
Model name: Intel(R) Core(TM) i7-8850H CPU @ 2.60GHz
Stepping: 10
CPU MHz: 2601.612
BogoMIPS: 5203.22
Hypervisor vendor: KVM
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 9216K
NUMA node0 CPU(s): 0,1
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 rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc tsc_known_freq pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single kaiser fsgsbase bmi1 avx2 bmi2 invpcid rdseed clflushopt md_clear flush_l1d arch_capabilities
- 소켓: 물리적인 CPU 개수
- 코어: 물리적인 CPU 안에 존재하는 컴퓨팅 코어 개수
- Architecture: 프로세서의 아키텍처
- CPU op-mode(s): 프로세서가 지원하는 작동 모드
- Byte Order: 바이트 순서
- CPU(s): 사용 가능한 CPU(또는 vCPU)의 수
- On-line CPU(s) list: 현재 오라인 상태인 CPU의 목록
- Thread(s) per core: 각 코어 당 스레드 수
- Core(s) per socket: 각 소켓에 있는 코어 수
- Socket(s): 사용 가능한 소켓 수
- NUMA node(s): Non-Uniform Memory Access (NUMA) 노드 수
- Vendor ID: CPU 제조사
- CPU family: CPU 패밀리 번호
- Model: CPU 모델 번호
- Model name: CPU의 전체 모델 이름
- Stepping: 리비전 번호
- CPU MHz: 현재 CPU의 클럭 속도
- BogoMIPS: 시스템의 Bogus Operations Per Second를 측정하는 데 사용되는 값
- Hypervisor vendor: 가상화 레이어의 공급자
- Virtualization type: 가상화 유형
- L1d cache, L1i cache, L2 cache, L3 cache: 각 레벨의 캐시 크기
- L1d cache (Level 1 Data Cache)
- 용도: 이 캐시는 프로세서가 처리할 데이터를 저장, 연산에서 사용되는 변수나 배열 요소 등의 실제 데이터 값이 저장
- 특징: 프로그램이 실행되면서 자주 사용되는 데이터는 이 캐시에 보관되어 빠른 액세스를 위해 활용
- L1i cache (Level 1 Instruction Cache)
- 용도: 이 캐시는 프로세서가 실행할 명령어를 저장, 프로그램 코드의 명령어나 연산 코드(opcode)와 같은 실제 실행 명령이 여기에 저장
- 특징: L1i 캐시는 명령어의 연속적인 순차 실행을 지원하기 위해 설계되었으며 프로그램이 실행될 때 자주 사용되는 코드 블록이 이 캐시에 보관되어 프로세서가 빠르게 명령어를 가져와 실행
- 일반적으로 데이터와 명령어는 서로 다른 액세스 패턴을 가지므로 별도의 캐시로 관리하여 각각의 캐시 효율성을 높이는 캐시 분할(dual cache) 설계를 사용
- L1d cache (Level 1 Data Cache)
- NUMA node0 CPU(s): NUMA 노드 0에 연결된 CPU의 목록
- Flags: CPU가 지원하는 기능 및 확장 목록
메모리 정보 확인하기
[ec2-user@ip-172-31-47-71 ~]$ sudo dmidecode -t memory
# dmidecode 3.2
Getting SMBIOS data from sysfs.
SMBIOS 2.7 present.
Handle 0x1000, DMI type 16, 19 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, 34 bytes
Memory Device
Array Handle: 0x1000
Error Information Handle: 0x0000
Total Width: 64 bits
Data Width: 64 bits
Size: 4096 MB
Form Factor: DIMM
Set: None
Locator: DIMM 0
Bank Locator: Not Specified
Type: RAM
Type Detail: None
Speed: Unknown
Manufacturer: Not Specified
Serial Number: Not Specified
Asset Tag: Not Specified
Part Number: Not Specified
Rank: Unknown
Configured Memory Speed: Unknown
- Number Of Devices란은 슬롯에 장착 가능한 메모리 개수를 의미
Size: No Module Installed
가 표시될 경우 해당 메모리 디바이스에는 메모리가 꽂혀있지 않음- 최근에 프로세서는 NUMA라는 개념을 이용해서 각각의 CPU가 사용할 수 있는 로컬 메모리를 제공
- Array Handle: 이 메모리 장치가 속한 메모리 배열의 핸들
- Error Information Handle: 메모리 장치의 오류 정보 핸들
- Total Width: 데이터와 오류 보정 비트를 포함한 전체 메모리의 비트 폭
- Data Width: 실제 데이터의 비트 폭
- 여기서는 Total Width와 Data Width가 동일하고 이 말은 곧 오류 보정 비트가 존재하지 않는다는 것인데 Physical Memory Array의 Error Correction Type에는 Multi-bit ECC로 되어 있습니다. Why?!?!?!?!?!
- Size: 메모리 장치의 크기
- Form Factor: 메모리 모듈의 형태, DIMM(Dual In-line Memory Module)
- DIMM: DIMM은 마더 보드에 메모리 칩을 고정시키는 소규모 회로 기판입니다. DIMM에는 DRAM이라고 하는 일련의 메모리가 통합되어 기본 저장 공간을 제공합니다. 이 저장 공간은 저장된 명령이나 데이터를 지속적으로 읽고 CPU에 직접 실행하는 기본 메모리입니다.
- Set: 메모리 장치가 속한 세트 번호
- Locator: 메모리 장치의 물리적 위치나 소켓의 이름
- Bank Locator: 메모리 장치가 속한 은행 또는 컨트롤러의 이름
- Type: 메모리의 유형
- Type Detail: 메모리의 상세 유형
- Speed: 메모리의 동작 속도
- Manufacturer: 메모리 제조업체
- Serial Number: 메모리의 일련 번호
- Asset Tag: 자산 태그
- Part Number: 메모리의 부품 번호
- Rank: 메모리의 랭크 번호
- Configured Memory Speed: 메모리의 설정된 동작 속도
[ec2-user@ip-172-31-47-71 ~]$ sudo dmidecode -t memory | grep -i size:
Size: 4096 MB
- 위 명령어로 꽂혀있는 메모리 개수와 전체 메모리의 용량 확인 가능
- 위에서 추출한 전체 메모리의 용량과 free 명령을 통해 확인한 전체 메모리 크기와 다르다면 시스템의 메모리 인식에 뭔가 문제가 있다고 추측 가능
디스크 정보 확인하기
vagrant@ubuntu-xenial:~$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 2.0G 0 2.0G 0% /dev
tmpfs 396M 5.6M 390M 2% /run
/dev/sda1 39G 1.5G 38G 4% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
vagrant 466G 167G 300G 36% /vagrant
tmpfs 396M 0 396M 0% /run/user/1000
장치 컨트롤러의 타입에 따라 아래와 같이 분류할 수 있습니다.
hda
- IDE 타입 - 개인용 컴퓨터
sda
- SCSI 타입 - 서버용 컴퓨터, SATA, SAS
vda
- 가상화 타입 - 가상 서버 like XEN, KVM과 같이 하이퍼바이저 위에서 동작 중인 서버
위에서 마운트된 파일 시스템이 /dev/sda1이므로 파일 시스템의 장치 컨트롤러 타입이 SCSI 타입인 것을 알 수 있습니다.
디스크의 부가적인 정보 확인
smartctl -a /dev/sda
물리 디스크 정보 확인
smartctl -a /dev/sda -d [RAID 컨트롤러가 사용하는 드라이버], [디스크 베이]
...
smartctl -a /dev/sda -d cciss, 0
RAID 컨트롤러의 드라이버는 lsmod 명령어로 확인하실 수 있습니다.
네트워크 정보 확인하기
vagrant@ubuntu-xenial:~$ lspci | grep -i ether
00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02)
00:08.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02)
연결 상태를 확인하기 전 네트워크 인터페이스를 확인하기 위해 ifconfig 명령어를 실행합니다. 루프백 인터페이스를 제외하고 enp0s3과 enp0s8 두 개의 인터페이스 중 enp0s3을 확인해보겠습니다.
vagrant@ubuntu-xenial:~$ ifconfig
enp0s3 Link encap:Ethernet HWaddr 02:be:82:6b:cc:1d
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::be:82ff:fe6b:cc1d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:17806 errors:0 dropped:0 overruns:0 frame:0
TX packets:4679 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:22352339 (22.3 MB) TX bytes:438088 (438.0 KB)
enp0s8 Link encap:Ethernet HWaddr 08:00:27:22:1f:dc
inet addr:172.30.1.97 Bcast:172.30.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe22:1fdc/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:22 errors:0 dropped:0 overruns:0 frame:0
TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2572 (2.5 KB) TX bytes:1332 (1.3 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
연결 상태 확인
vagrant@ubuntu-xenial:~$ sudo ethtool enp0s3
Settings for enp0s3:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full # 확인 1
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full # 확인 2
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Speed: 1000Mb/s # 실제 연결 속도
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
MDI-X: off (auto)
Supports Wake-on: umbg
Wake-on: d
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes
Ring Buffer 크기 확인
# 링버퍼 크기 확인
vagrant@ubuntu-xenial:~$ ethtool -g enp0s3
Ring parameters for enp0s3:
Pre-set maximums: # maximums (하드웨어가 지원하는 최대 ring buffer 크기)
RX: 4096
RX Mini: 0
RX Jumbo: 0
TX: 4096
Current hardware settings: # current (현재 설정된 최대 ring buffer 크기)
RX: 256
RX Mini: 0
RX Jumbo: 0
TX: 256
# rx, tx 필드의 값을 4096로 설정
ethtool -G enp0s3 rx 4096 -G enp0s3 tx 4096
# 영구적으로 변경 하기 위해 네트워크 스크립트 설정
ETHTOOL_OPTS="-G ${DEVICE} rx 4096 ; -G {$DEVICE} tx 4096"
본문에서는 항상 maximums 값과 current 값이 같도록 셋팅해야 한다고 권장하고 있습니다.
현재 설정에서 만약 네트워크 트래픽이 많아져서 패킷 드롭이 발생한다면 current 값을 늘려서 ring buffer의 크기를 조정할 수 있습니다.
RX
는 Receive (수신) - 네트워크 카드에서 시스템 메모리로 데이터 패킷을 수신할 때 사용하는 버퍼TX
는 Transmit (송신) - 시스템 메모리에서 네트워크 카드로 데이터 패킷을 송신할 때 사용하는 버퍼
케이블을 통해서 들어온 패킷 정보는 제일 먼저 네트워크 카드의 Ring Buffer라는 버퍼 공간에 복사되고 그 후 커널에 패킷의 도착을 알리고 패킷의 정보를 다시 커널로 복사합니다. 그렇기 때문에 Ring Buffer의 크기가 작다면 네트워크 성능 저하를 일으킬 수 있습니다.
- Ring Buffer: 네트워크 카드의 버퍼 공간
- 패킷의 복사 이동 순서: 케이블 -> 네트워크 카드의 Ring Buffer -> 커널
네트워크 성능 최적화 옵션 확인
vagrant@ubuntu-xenial:~$ ethtool -k enp0s3
Features for enp0s3:
rx-checksumming: off
tx-checksumming: on
tx-checksum-ipv4: off [fixed]
tx-checksum-ip-generic: on
tx-checksum-ipv6: off [fixed]
tx-checksum-fcoe-crc: off [fixed]
tx-checksum-sctp: off [fixed]
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: off [fixed]
tx-tcp6-segmentation: off [fixed]
udp-fragmentation-offload: off [fixed]
generic-segmentation-offload: on
generic-receive-offload: on # 확인
...(생략)
ethtool -K enp0s3 ... # ...란에 옵션과 설정할 값 기입하여 최적화 옵션 설정
generic-receive-offload
필드는 tcp-offload 기능 옵션으로 MTU 이상의 크기를 가지는 패킷의 분할 작업을 CPU가 아닌 네트워크 카드가 직접 함으로써 CPU의 부담을 줄이고 패킷 처리 성능을 높이는 기능입니다. 하지만 이 기능은 특정한 환경, 예를 들어 네트워크 대역폭이 아주 높은 서버들에서 이슈를 일으킬 수 있기 때문에 불특정한 패킷 유실이 자주 일어나는 것 같다면 기능을 Off하는 것을 권장하고 있습니다.
네트워크 카드 커널 모듈 정보 결과 확인
vagrant@ubuntu-xenial:~$ ethtool -i enp0s3
driver: e1000
version: 7.3.21-k8-NAPI
firmware-version:
expansion-rom-version:
bus-info: 0000:00:03.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no
위 명령어 결과를 통해 네트워크 카드가 어떤 커널 드라이브를 사용하고 어떤 버전을 사용하는지 확인할 때 사용할 수 있습니다.