DevOps

DevOps에서 참고하면 좋은 리눅스 커널 정보 확인 (2)

궁금한게 많은 개발자 2024. 12. 10. 16:25


이제 디스크 정보를 확인해보려 합니다. 지금까지 dmidecode 명령어를 사용하여 CPU, BIOS, 메모리 정보를 확인했습니다. 디스크는 df 명령어로 정보를 확인할 수 있습니다.

$  df -h
파일 시스템     크기  사용  가용 사용% 마운트위치
tmpfs           3.2G  3.6M  3.1G    1% /run
/dev/sda5       457G   60G  374G   14% /
tmpfs            16G  106M   16G    1% /dev/shm
tmpfs           5.0M  4.0K  5.0M    1% /run/lock
efivarfs        256K  110K  142K   44% /sys/firmware/efi/efivars
/dev/nvme0n1p1  256M   53M  204M   21% /boot/efi
tmpfs           3.2G  144K  3.2G    1% /run/user/1000

위 서버는 2개의 파티션이 있으며, 디스크 방식에 따라 /dev/sda, /dev/hda, /dev/nvme, /dev/vda 등으로 나뉠 수 있습니다.

sda와 hda의 차이점을 알아보겠습니다. 시스템이 디스크와 통신하기 위해 사용하는 것 중 컨트롤러라는 부품이 있는데 이 부품은 실제 디스크와 디스크를 사용하려는 쪽 사이에서 통신이 원활히 이루어질 수 있도록 일종의 중개자 역할을 하는 제품으로 IDE타입과 SCSI타입이 있습니다. IDE는 개인용 컴퓨터를 위한 방식, SCSI는 서버용으로 IDE방식은 hda, SCSI방식의 디스크와 최근에 나오는 SATA, SAS와 같은 일반적인 하드 디스크는 sda로 표기됩니다.

vda는 가상 서버에서 주로 확인할 수 있는 디스크 타입으로 XEN, KVM과 같은 하이퍼바이저 위에서 동작 중인 서버들에서 주로 확인할 수 있으며, nvme는 SSD를 사용한다고 이해하면 좋을 것 같습니다.

 

 

이렇게 df 명령어를 통해서도 현재 시스을 구성하고 있는 파티션과 디스크 타입 정보 정도는 간략히 알 수 있지만, 디스크의 물리적인 정보는 smartctl 이라는 툴을 사용해서 확인할 수 있습니다.

$ sudo apt install smartmontools
$ sudo smartctl -a /dev/sda     
smartctl 7.2 2020-12-30 r5155 [x86_64-linux-6.5.0-41-generic] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Device Model:     TOSHIBA MQ04ABF100
Serial Number:    21SQP2JYT
LU WWN Device Id: 5 000039 a9b21009a
...

-a 옵션으로 디스크의 위치를 입력하면 간단한 정보를 확인할 수 있으며, 논리적 디스크인 경우 -d 옵션을 추가하면 물리적 디스크의 정보까지 확인할 수 있습니다. (smartctl 명령은 RAID 컨트롤러의 드라이버에 따라 -d 옵션 뒤에 추가 옵션을 통해 디스크 정보를 볼 수 있도록 해줍니다 - 현재 시스템의 RAID 컨트롤러의 드라이버는 lsmod 명령을 통해 확인 가능)

 

 

 

 

 

마지막으로 네트워크 정보 확인입니다.

네트워크 카드 정보 역시 하드웨어적인 이슈를 확인하고 해결할 때 유용하게 사용됩니다. 네트워크 카드의 정보는 lspci 명령을 통해 확인할 수 있습니다.

$ lspci | grep -i ether
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)

이 정보가 중요한 이유는 간혹 특정 모델에서 버그나 이슈 등이 보고될 때 자신의 서버가 해당되는지 파악해야 하며, 커널 드라이버를 업데이트할 때에도 해당하는 펌웨어 드라이버를 정확하게 찾기 위해서입니다.

네트워크 연결 상태를 확인할 때는 ethtool 명령을 사용합니다.

$ sudo apt install ethtool
$ ethtool enp3s0   
Settings for enp3s0:
	Supported ports: [ TP	 MII ]
	Supported link modes:   10baseT/Half 10baseT/Full
	                        100baseT/Half 100baseT/Full
	                        1000baseT/Full
	Supported pause frame use: Symmetric Receive-only
	Supports auto-negotiation: Yes
...

$ ethtool -g enp3s0
Ring parameters for enp3s0:
Pre-set maximums:
RX:		256
RX Mini:	n/a
RX Jumbo:	n/a
TX:		256
Current hardware settings:
RX:		256
RX Mini:	n/a
RX Jumbo:	n/a
TX:		256

ethtool을 통해서 확인할 수 있는 정보에도 상당히 중요한 내요이 포함되어 있습니다. 우선 해당 네트워크가 어느 정도 속도까지 지원이 가능한지, 그리고 현재 연결되어 있는 속도는 얼마인지, 네트워크 연결은 정상적인지 등을 확인할 수 있습니다. 특히 현재 연결 상태에 따른 속도가 정상적인지를 판단할 수 있습니다. 의도한 만큼 속도가 나오지 않을 때 확인해야 하며, 케이블 불량이나 연결할 때의 옵션 값 문제가 있을 수 있기 때문입니다.

 

또한 옵션으로 네트워크 카드의 여러 가지 셋팅 정보도 확인할 수 있습니다. -g 옵션을 사용하면 Ring Buffer의 크기를 확인할 수 있습니다. 네트워크 카드의 버퍼 공간을 의미하며 케이블을 통해 들어온 패킷 정보는 제일 먼저 Ring Buffer에 복사되고 커널에 패킷 도착을 알린 후, 정보를 다시 커널로 복사합니다. 그렇기 때문에 Ring Buffer 크기가 작다면 네트워크 성능 저하를 일으킬 수 있습니다. 항상 maximums값과 currents값이 같도록 세팅해야 합니다.

(-G 대문자 옵션을 통해 특정 값을 설정할 수 있습니다.)

 

다음은 -k 옵션으로 현재 사용 중인 네트워크 카드의 다양한 성능 최적화 옵션을 확인할 수 있습니다. -K옵션은 마찬가지로 성능 최적화 옵션을 활성화할 때 사용합니다.

$ ethtool -k enp3s0
Features for enp3s0:
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: off [fixed]
...

네트워크 카드는 단순하게 패킷을 주고 받는 기능 외에도 더 빠르게 패킷을 주고 받을 수 있게 해주는 다양한 기능을 제공합니다. 여기에서 가장 중요한 기능 중 하나가 tcp-offload기능인데, 이 기능은 MTU(Maximum Transmission Unit) 이상의 크기를 가지는 패킷의 분할 작업을 CPU가 아닌 네트워크 카드가 직접 함으로써 CPU의 부담을 줄이고 패킷 처리 성능을 높이는 기능입니다.

하지만 이 기능은 특정 환경(네트워크 대역폭이 아주 높은 서버)에서 이슈를 일으킬 수 있기에 불특정한 패킷 유실이 자주 일어나는 것 같은 경우에는 비활성화 하는 것이 좋습니다. 

 

마지막은 -i 옵션입니다. 이는 네트워크 카드의 커널 모듈 정보를 표시합니다.

$ ethtool -i enp3s0
driver: r8169
version: 6.5.0-41-generic
firmware-version: rtl8168h-2_0.0.2 02/26/15
expansion-rom-version: 
bus-info: 0000:03:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no

이 명령을 통해 사용 중인 네트워크 카드가 어떤 커널 드라이버를 사용하는지, 버전이 몇인지를 알 수 있습니다. 마찬가지로 특정 커널 드라이버에 문제가 있을 경우 내가 사용하는 버전이 해당하는지를 판단하는데 사용됩니다.

 

 

 

 

 

이로써 시스템의 정보를 확인하는 방법을 대략적으로 알아봤습니다. 설명한 방법 이외에도 많은 정보가 있고 방법이 있겠지만, 대표적으로 시스템 정보 확인에 많이 사용되는 명령을 소개했습니다. 

CPU, 메모리, 디스크, 네트워크 카드 등은 서버를 이루는 중요한 리소스들이며 각각의 정보를 파악하는 것이 문제 해결의 첫 단계라고 생각합니다. 위 내용들을 잘 정리해두면 실무에 많은 도움이 되지 않을까 싶습니다.

긴 글 읽어주셔서 감사합니다 😊👍