🐧 Linux, shell, web server
kernel study 01: 시스템 구성 정보 확인하기
DarrenKwonDev
2023. 12. 27. 02:34
https://darrenkwondev.github.io/posts/2023-12-27_kernel_study_01.md/kernel_study_01/
위에서 더 깔끔하게 읽을 수 있겠습니다.
---
+++
title = 'kernel study 01: 시스템 구성 정보 확인하기'
date = 2023-12-27T00:02:35+09:00
math = true
toc = true
bold = true
draft = false
tags = ["linux", "system engineering", "korean"]
+++
{{< box info >}}
based on Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-91-generic aarch64) VM
{{< /box >}}
## 커널 정보 확인
### uname (UNIX name)
커널 이름, 호스트 이름, 커널 버전, 커널 릴리즈, 운영 체제, 하드웨어 이름(아키텍처) 등 시스템 정보를 출력하는 도구
```
# uname -a
Linux drkup 5.15.0-91-generic #101-Ubuntu SMP Tue Nov 14 13:29:11 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux
```
5.15.0-91-generic 커널을 사용 중임을 확인할 수 있다.
### dmesg (display message)
커널의 메시지 버퍼의 내용을 출력하는 도구.
kernel이 부팅되면서 출력했된 내용을 살펴보겠습니다.
```
# sudo dmesg | grep -i kernel | more
# kernel 문자열을 포함한 로그만 출력해보았다.
# 좌측 괄호 [] 안은 시스템 부팅 이후 경과한 시간을 초 단위를 표현한 것이다.
# 커널 코드에 패치 적용 (시스템이 부팅되는 과정)
[ 0.000000] alternatives: patching kernel code
# 커널 파라미터. BOOT_IMAGE, root, ro 등이 보인다.
[ 0.000000] Kernel command line: BOOT_IMAGE=/vmlinuz-5.15.0-91-generic root=/dev/mapper/ubuntu--vg-ubuntu--lv ro
# 주어진 커널 파라미터이지만 인식하지 못하는 파라미터는 user space로 전달된다.
[ 0.000000] Unknown kernel command line parameters "BOOT_IMAGE=/vmlinuz-5.15.0-91-generic", will be passed to user space.
# 커널이 인식하는 메모리 정보.
# 시스템에 4194304K 메모리가 존재하며 3860508K가 사용 가능하다.
[ 0.000000] Memory: 3860508K/4194304K available (17280K kernel code, 4576K rwdata, 13928K rodata, 9600K init, 1194K bss, 301028K reserved
, 32768K cma-reserved)
# 직접 메모리 액세스(DMA)에 사용되는 사전 할당된 메모리 풀 관련 로그
# CPU를 거치지 않고 메모리와 하드웨어 장치 간에 데이터를 직접 전송하기 위해 필요합니다.
[ 0.084903] DMA: preallocated 512 KiB GFP_KERNEL pool for atomic allocations
[ 0.085653] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
[ 0.086177] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
# 커널이 로드한 X.509 인증서 관련 로그
[ 0.744737] Loaded X.509 cert 'Build time autogenerated kernel key: a3ee82ff8d989103803e60e521b19f3fabe02ee9'
[ 0.746343] Loaded X.509 cert 'Canonical Ltd. Kernel Module Signing: 88f752e560a1e0737e31163a466ad7b70a850c19'
[ 0.797094] Loaded X.509 cert 'Build time autogenerated kernel key: a3ee82ff8d989103803e60e521b19f3fabe02ee9'
# 시스템 부팅 하면서 사용했던 메모리를 반환
[ 0.802006] Freeing unused kernel memory: 9600K
# systemd 작업들.
[ 3.234080] systemd[1]: Listening on udev Kernel Socket.
[ 3.236727] systemd[1]: Mounting Kernel Debug File System...
[ 3.241096] systemd[1]: Mounting Kernel Trace File System...
[ 3.276186] systemd[1]: Starting Load Kernel Module chromeos_pstore...
[ 3.278110] systemd[1]: Starting Load Kernel Module configfs...
[ 3.283414] systemd[1]: Starting Load Kernel Module drm...
[ 3.285204] systemd[1]: Starting Load Kernel Module efi_pstore...
[ 3.290713] systemd[1]: Starting Load Kernel Module fuse...
[ 3.298218] systemd[1]: Starting Load Kernel Module pstore_blk...
[ 3.302885] systemd[1]: Starting Load Kernel Module pstore_zone...
[ 3.305147] systemd[1]: Starting Load Kernel Module ramoops...
[ 3.311579] systemd[1]: Starting Load Kernel Modules...
[ 3.313671] systemd[1]: Starting Remount Root and Kernel File Systems...
```
### /boot/config-$(uname -r)
커널의 컴파일 옵션을 확인해보겠습니다. 특정 옵션이 활성화 되어 있어야만 사용할 수 있는 기능이 존재합니다.
예를 들어 ftrace를 사용하기 위해서는 CONFIG_FTRACE 옵션이 활성화 되어 있어야 합니다.
```
#cat /boot/config-$(uname -r) | head -n 10
# 너무 많은 옵션이 존재하니 앞의 10줄 정도만 출력해보았습니다.
#
# Automatically generated file; DO NOT EDIT.
# Linux/arm64 5.15.0-91-generic Kernel Configuration
#
CONFIG_CC_VERSION_="gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0"
CONFIG_CC_IS_GCC=y
CONFIG_GCC_VERSION=110400
CONFIG_CLANG_VERSION=0
CONFIG_AS_IS_GNU=y
CONFIG_AS_VERSION=23800
```
## dmidecode (dmi : Desktop Management Interface)
하드웨어 정보를 보여주는 명령어입니다. 이 명령어는 시스템의 BIOS, 시스템 보드, 프로세서, 메모리 등과 같은 다양한 컴포넌트에 대한 상세한 정보를 제공합니다.
가능한 타입을 나열하면 아래와 같습니다.
```
Valid type keywords are:
bios
system
baseboard
chassis
processor
memory
cache
connector
slot
```
### dmidecode -t bios
BIOS(Basic Input/Output System)를 확인해보겠습니다.
```
# dmidecode -t bios
# UTM VM에서 실행하여 흔히 보이는 vendor가 아닌 UEFI 환경임을 확인할 수 있습니다.
# dmidecode 3.3
Getting SMBIOS data from sysfs.
SMBIOS 3.0.0 present.
Handle 0x0000, DMI type 0, 26 bytes
BIOS Information
#
Vendor: EFI Development Kit II / OVMF
Version: 0.0.0
Release Date: 02/06/2015
Address: 0xE8000 # bios가 메모리 상에서 위치한 시작 주소
Runtime Size: 96 kB # bios run time의 크기입니다.
ROM Size: 64 kB
Characteristics:
BIOS characteristics not supported
Targeted content distribution is supported
UEFI is supported
System is a virtual machine
BIOS Revision: 0.0
```
### dmidecode -t system
시스템 관련 정보를 출력해보겠습니다. 컴퓨터를 구성하는 다양한 하드웨어의 모델명 등을 확인할 수 있습니다.
```
# dmidecode -t system
# VM이라서 에뮬레이터인 QEMU를 사용하고 있음을 확인할 수 있습니다.
# dmidecode 3.3
Getting SMBIOS data from sysfs.
SMBIOS 3.0.0 present.
Handle 0x0100, DMI type 1, 27 bytes
System Information
Manufacturer: QEMU
Product Name: QEMU Virtual Machine
Version: virt-7.2
Serial Number: Not Specified
UUID: <omit>
Wake-up Type: Power Switch
SKU Number: Not Specified
Family: Not Specified
Handle 0x2000, DMI type 32, 11 bytes
System Boot Information
Status: No errors detected
```
## cpu[^1]
### /proc/cpuinfo
```
# cat /proc/cpuinfo
processor : 0
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 asimddp sha512 asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp flagm2 frint
CPU implementer : 0x00
CPU architecture: 8
CPU variant : 0x0
CPU part : 0x000
CPU revision : 0
(omit)
```
### dmidecode -t processor
cpu(processor) 정보를 출력해보겠습니다.
자주 출력해보는 내용이기 때문에 가상 머신이 아닌 타 기기에서 출력된 내용물을 가지고 설명해보겠습니다.
장착된 cpu가 1개라고 인식되기 때문에 하나의 cpu 정보만 출력되었습니다. 만약 motherboard의 소켓에 여러 cpu를 장착했다면, 해당 갯수만큼 출력될 것입니다.
흔히 물리적 cpu 코어의 갯수와 논리적 cpu 코어의 갯수를 헷갈리는데 해당 출력을 통해 명확히 구분할 수 있습니다. Socket Designation은 곧 cpu가 mother board에 장착된 소켓의 위치이며, Core Count는 장착된 하나의 cpu가 소유한 컴퓨팅 코어를 의미합니다. 아래 출력물을 기준으로 설명하자면, 물리적으로 cpu는 2개가 소켓에 장착되어 있으며 각각 8개의 코어를 가지고 있으며 하이퍼 쓰레딩이 적용되어 있어 하나의 코어당 2개 이상의 thread가 존재하는 것으로 확인됩니다.
```
# dmidecode -t processor
# dmidecode 3.3
Getting SMBIOS data from sysfs.
SMBIOS 3.2.0 present.
Handle 0x0400, DMI type 4, 48 bytes
Processor Information
Socket Designation: CPU 0 # cpu가 장착된 소켓의 이름입니다. MB에 cpu를 장착할 때 사용하는 소켓의 이름과 동일합니다.
Type: Central Processor # cpu임을 나타냅니다.
Family: Xeon
Manufacturer: Intel
ID: C3 06 03 00 FF FB EB BF
Version: Intel(R) Xeon(R) CPU E5-2600 v4
Voltage: 1.2 V
External Clock: 100 MHz
Max Speed: 3000 MHz
Current Speed: 3000 MHz
Status: Populated, Enabled
Upgrade: Socket LGA 2011
L1 Cache Handle: 0x0700
L2 Cache Handle: 0x0701
L3 Cache Handle: 0x0702
Serial Number: Not Specified
Asset Tag: Not Specified
Part Number: Not Specified
Core Count: 8 # cpu가 소유한 물리적 core 갯수를 의미합니다.
Core Enabled: 8
Thread Count: 16 # 일반적으로 하이퍼스레딩 또는 다중 스레딩 기술이 적용된 경우, 물리적 코어 수보다 스레드 수가 더 많습니다.
Characteristics:
64-bit capable
Multi-Core
Hardware Thread
# 다른 소켓에 장착된 cpu의 정보를 출력합니다. 해당 컴퓨터가 2개의 cpu를 장착하고 있음을 의미합니다.
Handle 0x0401, DMI type 4, 48 bytes
Processor Information
Socket Designation: CPU 1
Type: Central Processor
Family: Xeon
Manufacturer: Intel
ID: C3 06 03 00 FF FB EB BF
Version: Intel(R) Xeon(R) CPU E5-2600 v4
Voltage: 1.2 V
External Clock: 100 MHz
Max Speed: 3000 MHz
Current Speed: 3000 MHz
Status: Populated, Enabled
Upgrade: Socket LGA 2011
L1 Cache Handle: 0x0703
L2 Cache Handle: 0x0704
L3 Cache Handle: 0x0705
Serial Number: Not Specified
Asset Tag: Not Specified
Part Number: Not Specified
Core Count: 8
Core Enabled: 8
Thread Count: 16
Characteristics:
64-bit capable
Multi-Core
Hardware Thread
```
### lscpu
cpu와 관련된 정보를 출력하는 명령어입니다. dmidecode와 비슷한 역할을 하지만, 더 간단하게 출력해줍니다.
특히, NUMA와 관련된 정보를 출력해주는 점이 차이점입니다.
```
# lscpu
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Vendor ID: 0x00
Model: 0
Thread(s) per core: 1
Core(s) per socket: 8
Socket(s): 1
Stepping: 0x0
BogoMIPS: 48.00
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 asimddp s
ha512 asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp flagm2 frint
NUMA:
NUMA node(s): 1
NUMA node0 CPU(s): 0-7
Vulnerabilities:
Gather data sampling: Not affected
Itlb multihit: Not affected
L1tf: Not affected
Mds: Not affected
Meltdown: Not affected
Mmio stale data: Not affected
Retbleed: Not affected
Spec rstack overflow: Not affected
Spec store bypass: Vulnerable
Spectre v1: Mitigation; __user pointer sanitization
Spectre v2: Not affected
Srbds: Not affected
Tsx async abort: Not affected
```
## memory
### /proc/meminfo
메모리 정보를 출력하는 명령어입니다. 메모리의 총 용량, 사용량, 사용 가능한 용량 등을 확인할 수 있습니다.
```
# cat /proc/meminfo
MemTotal: 4004640 kB
MemFree: 1628216 kB
MemAvailable: 3582652 kB
Buffers: 62432 kB
Cached: 1957112 kB
SwapCached: 0 kB
Active: 623540 kB
Inactive: 1451744 kB
Active(anon): 1332 kB
```
### free
```
# free
total used free shared buff/cache available
Mem: 4004640 225444 1628468 5380 2150728 3582876
Swap: 3001340 0 3001340
```
total = used + free + buff/cached
- total : Total installed memory (MemTotal and SwapTotal in /proc/meminfo)
- used : Used memory (= total - free - buffers - cache)
- 진짜로 사용되고 있는 영역이 아니라, buff/cache를 제외한 메모리를 말합니다.
- free : Unused memory (MemFree and SwapFree in /proc/meminfo)
- buff/cache = 디스크에 있는 파일이 메모리에 올라와 유지된 것들. 사실상 쓰고 있지만 used로 잡히지가 않음
- buffers : Memory used by kernel buffers (Buffers in /proc/meminfo)
- 파일 정보, 파일의 메타 데이터를 의미합니다.
- cache : Memory used by the page cache and slabs (Cached and SReclaimable in /proc/meminfo)
- 파일의 실제 내용을 저장되는데 사용됩니다.
- 예를 들면 동영상 파일이 메모리에 올라와 있다면 buffer는 작겠지만 cache는 클 것이라 예측할 수 있다.
- shared : Memory used (mostly) by tmpfs (Shmem in /proc/meminfo)
- available : Estimation of how much memory is available for starting new applications, without swapping.
- 어떤 프로세스가 만들어진다면 메모리를 사용할 때 최대 어디까지 사용할 수 있음?
- 보통 buff/cache + free 정도임.
### dmidecode -t memory
dmidecode의 메모리 정보 출력물을 통해서, 메모리를 Physical Memory Array와 Memory Device로 구분하여 출력합니다.
```
# dmidecode -t memory
# dmidecode 3.3
Getting SMBIOS data from sysfs.
SMBIOS 3.0.0 present.
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
```
## disk
### df (disk free)
각 파일 시스템이 마운트 된 곳과 용량을 출력합니다.
/dev/mapper/ubuntu--vg-ubuntu--lv, /dev/vda1, /dev/vda2 3개의 파일 시스템이 확인됩니다.
마운트된 경로를 보니 vda1, vda2는 부트 파티션으로 사용되고 있고, ubuntu--vg-ubuntu--lv는 루트 파티션으로 사용되고 있음을 확인할 수 있습니다.
VM 위의 파일 시스템이기 때문에 vda로 시작하는 이름을 가지고 있습니다. 일반적으로는 hda나 sda로 시작하는 이름을 가지고 있습니다.
tmpfs 는 임시 파일 시스템을 의미합니다.
```
# df -h (human readable)
Filesystem Size Used Avail Use% Mounted on
tmpfs 392M 1.4M 390M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 15G 7.0G 6.5G 52% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/vda2 2.0G 129M 1.7G 8% /boot
/dev/vda1 1.1G 6.4M 1.1G 1% /boot/efi
tmpfs 392M 4.0K 392M 1% /run/user/1000
```
### lsblk (list block devices)
블록 장치(디스크, 파티션, 논리 볼륨 등)에 대한 정보를 출력합니다.
특히, RAID 구성 여부를 확인할 수 있습니다.
```
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 59.2M 1 loop /snap/core20/1977
loop1 7:1 0 109.6M 1 loop /snap/lxd/24326
loop2 7:2 0 46.4M 1 loop /snap/snapd/19459
loop3 7:3 0 35.5M 1 loop /snap/snapd/20298
sr0 11:0 1 1024M 0 rom
vda 252:0 0 32G 0 disk
├─vda1 252:1 0 1G 0 part /boot/efi
├─vda2 252:2 0 2G 0 part /boot
└─vda3 252:3 0 28.9G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 14.5G 0 lvm /
```
MAJ:MIN: major, minor number. 커널이 해당 디스크를 식별하는 데 사용하는 고유 번호입니다.
RM: 디스크의 제거 가능 여부
RO: 읽기 전용 여부
TYPE: 디스크의 타입. lvm(logical volume manager)를 사용하고 있음을 확인할 수 있습니다. RAID로 구성여부도 출력됩니다.
MOUNTPOINTS: 마운트된 경로
```
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1TB 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
├─sda2 8:2 0 2GB 0 part [SWAP]
└─sda3 8:3 0 997.5G 0 part
└─md0 9:0 0 1.9T 0 raid1 /
sdb 8:16 0 1TB 0 disk
├─sdb1 8:17 0 512M 0 part
├─sdb2 8:18 0 2GB 0 part
└─sdb3 8:19 0 997.5G 0 part
└─md0 9:0 0 1.9T 0 raid1 /
```
위 예시에서 "sda"와 "sdb" 디스크는 RAID1으로 구성되었습니다. "md0"은 RAID 레이드 장치를 나타내며 "/dev/md0"는 RAID로 구성된 볼륨을 나타냅니다. RAID 구성은 여러 디스크의 복제 또는 데이터 분산을 허용하므로 "md0"의 하위 항목으로 "sda3"와 "sdb3"이 나타납니다.
## network (네트워크 카드)
### 네트워크 카드(NIC) 확인하기
lspci 명령어는 PCI 버스를 통해 연결된 장치들의 정보를 출력합니다.
여기서는 네트워크와 관련된 정보만을 grep하기 위해 grep 명령어를 사용하였습니다.
구체적으로, 서버가 사용하는 네트워크 카드(NIC)를 확인할 수 있습니다.
```
# lspci | grep -i ether
00:01.0 Ethernet controller: Red Hat, Inc. Virtio network device
```
### ip로 network interface 확인
{{< box tip >}}
ifconfig 보다 ip 사용을 권장함. ifconfig는 유지 보수가 끝났으나 ip는 리눅스 커널과 같이 개발되며 지속적으로 유지보수되고 있음.
{{< /box >}}
```
ip address # ip a로만 입력 가능
ip link # 네트워크 인터페이스 확인
ip neigh # ARP 테이블 (mac 주소) 확인하기
```
해당 글에서는 하드웨어적인 측면에서 살펴봐야하므로 ip 명령어에 대한 설명은 네트워크 인터페이스의 목록을 확인하는 것 정도로 마치겠습니다.
```
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 1e:6f:22:b0:70:1e brd ff:ff:ff:ff:ff:ff
inet 192.168.64.4/24 metric 100 brd 192.168.64.255 scope global dynamic enp0s1
valid_lft 72571sec preferred_lft 72571sec
inet6 fd1d:e88a:d67e:2671:1c6f:22ff:feb0:701e/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 2591943sec preferred_lft 604743sec
inet6 fe80::1c6f:22ff:feb0:701e/64 scope link
valid_lft forever preferred_lft forever
```
루프팩 인터페이스를 제외하고, enp0s1 인터페이스, en(이더넷), po(포트), s1(슬롯1)을 의미합니다.
### ethtool
위에서 확인한 네트워크 인터페이스의 구체적인 정보를 확인해볼 수 있습니다.
안타깝게도 가상 머신에서는 정상적인 값을 출력하지 않으므로 타 기기의 출력물을 살펴보겠습니다.
Supported link modes는 네트워크 카드가 지원하는 연결 모드를 의미합니다.
Advertised link modes는 네크워크 상 다른 장치와 연결 할 때 사용할 수 있는 연결 모드를 의미합니다.
해당 네트워크 카드가 지원하는 연결 모드와 속도를 확인해보겠습니다.
{{< box tip >}}
Half Duplex and Full Duplex
Half Duplex는 데이터가 한 번에 한 방향으로만 전송될 수 있음을 의미합니다.
Full Duplex는 데이터가 동시에 양방향으로 전송될 수 있음을 의미합니다.
{{< /box >}}
- 10baseT/Half 10baseT/Full: 10 Mbps 속도의 Half Duplex와 Full Duplex 연결을 지원합니다.
- 100baseT/Half와 100baseT/Full: 각각 100 Mbps의 Half Duplex와 Full Duplex 연결을 지원합니다.
- 1000baseT/Full: 1000 Mbps (1 Gbps) 속도의 Full Duplex 연결을 지원합니다.
```
Settings for enp0s1:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Link partner advertised link modes: Not reported
Link partner advertised pause frame use: No
Link partner advertised auto-negotiation: No
Speed: 1000Mb/s # 현재 속도
Duplex: Full # duplex 지원
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
MDI-X: off (auto)
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes # 정상적으로 연결되었음을 의미합니다.
```
### ethtool -g (ring buffer)
NIC의 버퍼 공간인 ring buffer의 크기를 확인해볼 수 있습니다.
패킷이 전달되면 ring buffer에 우선 복사된 후 커널에 의해 처리됩니다.
ring buffer가 너무 작다면 자주 커널에 의해 처리되어야 하므로 성능 저하가 발생할 수 있습니다.
관습적으로 pre-set maximums와 같게 hardware settings을 맞춰야 합니다.
수정을 원한다면 -G 플래그를 통해 수정할 수 있습니다.
```
# ethtool -g enp0s1
Ring parameters for enp0s1:
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 -k
NIC 옵션을 확인할 수 있습니다.
tcp-offload 기능을 통해 mtu 이상의 크기를 가진 패킷의 분할 작업을 cpu가 아닌 NIC가 처리하도록 할 수 있습니다. 그러나 네트워크 대역폭이 높은 서버와 같이 특정 환경에서는 불특정한 패킷 유실이 발생할 수 있어 off 시키곤 합니다.
```
# ethtool -k enp0s1 | head -n 10
Features for enp0s1:
rx-checksumming: off [fixed]
tx-checksumming: off
tx-checksum-ipv4: off [fixed]
tx-checksum-ip-generic: off [fixed]
tx-checksum-ipv6: off [fixed]
tx-checksum-fcoe-crc: off [fixed]
tx-checksum-sctp: off [fixed]
scatter-gather: off
tx-scatter-gather: off [fixed]
```
### ethtool -i
NIC의 커널 드라이버 정보를 확인할 수 있습니다.
```
ethtool -i enp0s1
driver: virtio_net
version: 1.0.0
firmware-version:
expansion-rom-version:
bus-info: 0000:00:01.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no
```