리눅스 성능 최적화 및 개선 가이드
요약
본 가이드는 리눅스 환경에서 시스템 성능을 최적화하고 개선하는 방법을 상세히 다룹니다. 커널 컴파일, Btrfs 파일 시스템 튜닝, 부팅 매개변수 변경 등 다양한 고급 기술들을 포함하며, 하드웨어별(AMD, NVIDIA) 그래픽 카드 성능 개선 방법도 제시합니다.
핵심 포인트
- 커널을 직접 컴파일하고 패치를 적용하여 특정 환경에 최적화할 수 있습니다.
- Btrfs 파일 시스템 튜닝 및 swappiness 변경 등 다양한 고급 설정을 다룹니다.
- 하드웨어별(AMD, NVIDIA) 그래픽 카드 성능 개선 방법을 안내합니다.
- 초보자보다는 리눅스 경험이 있는 사용자에게 적합한 심화 가이드입니다.
리눅스 성능 최적화/개선
이 가이드는 제가 진행한 과정을 기록하고, 다른 분들이 리눅스 성능을 더욱 향상시키는 데 기여할 수 있도록 작성되었습니다. 결국 많은 사람이 한 사람보다 낫기 때문입니다. 이 내용들 중 전부 사용하거나 일부만 선택적으로 사용하실 수 있습니다.
시작하기 전에 반드시 주제를 완전히 읽어보세요.
저는 현재 Nobara와 Ubuntu를 사용하고 있어, 몇몇 단계는 배포판(distro)마다 다를 수 있습니다. 또한 Intel, AMD, NVIDIA 등 다양한 하드웨어 환경에서 테스트해 왔습니다.
참고: 이 가이드는 리눅스가 처음인 초보자를 위한 것이 아닙니다. 하지만 일부 내용은 초보자도 안전하게 사용할 수 있습니다.
시작하기 전에 고정 이슈(pinned issues)를 확인해 보세요.
이 블로그는 AI의 도움을 받아 작성되지 않았습니다. 여기에 언급된 모든 최적화 방법은 제가 실제로 사용한 것입니다.
목차 (Index)
- 커널 컴파일하기
- Btrfs 파일 시스템 최적화
- 부팅 매개변수 변경하기
- 부팅 시간 개선하기
- swappiness 변경하기
- scaling_governor를 performance로 변경하기
- 그래픽 카드 성능 개선하기
- 기타 최적화 (Some other tweaks)
- 도구 (Tools)
- 하드웨어 (Hardware)
커널 컴파일하기 (Compiling your kernel)
저는 다양한 결과를 얻었습니다. 어떤 게임에서는 약 20%의 성능 향상을 경험했지만, 다른 게임에서는 오히려 20%의 손실을 보기도 했습니다. 대부분의 성능 향상은 배포판에 기본으로 제공되는 커널을 가져와 패치를 적용하고 저의 특정 기계에 맞게 컴파일했을 때 얻었습니다. 반면, 시중에서 구매한(off-the-shelf) 커널을 사용했을 때는 일부 게임에서는 부스트를 받았지만 다른 게임에서는 손실이 발생하는 등 들쭉날쭉했습니다.
커널 컴파일에 필요한 패키지를 얻으려면 구글에 <배포판 이름>에서 사용자 정의 커널 만드는 방법(How to make custom kernel in <distro>)을 검색해 보시는 것이 좋습니다.
- 참고1: 이를 위해서는 패치(patches)를 적용해야 하므로, Nobara나 CachyOS가 적용한 패치를 확인해 보세요. 다음 섹션 패치 적용하기를 읽어보세요.
- 참고2: 또한 사용자 분의 배포판에 최적화를 적용하는 사전 빌드 커널(prebuild kernels)도 찾을 수 있습니다. 예: - XanMod, 등
- 참고3: 저는 팬 제어(fan control)와 같은 기능을 활성화하기 위해 사용자 정의 커널(custom kernel)을 사용한 적이 있습니다 (Dell를 보고 있군요 (ಡ_ಡ)☞).
-
최신 커널 또는 원하는 것을 다운로드하세요. 압축을 풀고, 지금부터는 일반적인 이름인
linux-x.x.x라고 가정하겠습니다. -
다음 단계는
config파일을 찾는 것입니다. 대부분의 경우 다음 명령어를 실행할 수 있습니다:
cp -v /boot/config-$(uname -r) .config
linux-x.x.x 내부에서, 다음과 같은 출력을 제공해야 합니다:
'/boot/config-y.y.y-generic' -> '.config'
만약 실패하면, /proc/config.gz에서 config를 찾거나 간단히 make listnewconfig 또는 make oldconfig를 실행할 수 있습니다 (보통 긴 프로세스를 시작합니다. 배포판 소스 코드에서도 config를 찾아보세요).
-
Makefile을 수정하고 무언가를 추가하기 위해EXTRAVERSION을 변경하세요. 예를 들어, ` -
(이 작업을 수행하기 전에 다음 하위 주제를 확인하는 것이 좋을 수 있습니다) 이제
make xconfig를 실행하세요. 여기서 많은 최적화가 가능합니다.
여기에서는 제거하고 활성화할 수 있는 많은 사용하지 않는 코드(dead codes)와 모듈들이 있습니다. 일단은 안전한 방법을 따르겠습니다.
- 가장 좋은 방법 중 하나는 더 이상 일반적인 커널을 위해 빌드하는 것이 아닙니다. 다음을 선택하세요:
- 프로세서 유형 및 기능
- 프로세서 패밀리
- [x] Core2/신형 Xeon
기본값은 Generic-x86-64여야 합니다.
- 할 수 있는 다른 많은 것들이 있지만, 그것들을 읽고 자신에게 가장 적합한 것을 확인해야 합니다. 간단한 방법은 clear linux config를 복사하는 것이지만, 특정 기능을 비활성화할 수도 있습니다 (다음 패치 적용 참조).
- 이제 다음을 실행해 볼 수 있습니다:
dmesg --level=err
dmesg --level=warn
추가 기능을 위해 추가 플래그를 활성화할 수 있는지 확인하기 위해서입니다. 예를 들어,
psmouse serio1: elantech: 구형 PS/2 프로토콜보다 더 나은 버스를 지원하는 터치패드가 있습니다. 더 나은 터치패드 경험을 얻으려면 MOUSE_PS2_ELANTECH_SMBUS와 MOUSE_ELAN_I2C_SMBUS가 모두 활성화되었는지 확인하십시오.
이 문제는 둘 다 활성화함으로써 해결될 수 있습니다.
- 마지막으로, 커널 컴파일:
# sed -ri '/CONFIG_SYSTEM_TRUSTED_KEYS/s/=.+/=""/g' .config
make -j N CFLAGS='-march=native -O3 -flto -pipe' CXXFLAGS='-march=native -O3 -flto -pipe'
make -j N CFLAGS='-march=native -O3 -flto -pipe' CXXFLAGS='-march=native -O3 -flto -pipe' modules
...
여기서 N은 사용자가 가진 코어(cores)의 개수이며, 대안으로 $(getconf _NPROCESSORS_ONLN)을 사용할 수 있습니다.
만약 어떤 단계에서 실패하면, make clean을 실행하고 다시 시작하세요.
- grub에 기본값 설정하기 (저는 grub2를 사용하고 있으므로, 귀하의 과정은 다를 수 있습니다):
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo grubby --set-default /boot/vmlinuz-x.x.x-x
사용자의 파일은 /boot/에서 vmlinuz-x.x.x-x를 찾을 수 있습니다.
이제 재부팅하여 uname -r을 실행해 커널 버전을 확인하세요.
패치 적용하기
성능을 높이거나 사용 편의성을 개선할 수 있는 여러 개의 패치가 있습니다.
사용 가능한 패치가 많기 때문에 자신에게 가장 적합한 것을 찾아야 합니다. 저는 여기에서 graysky2 커널 패치를 사용할 것입니다. 전체 저장소(repo)를 다운로드하거나 필요한 파일만 다운로드할 수 있습니다.
제 경우, GCC 10과 최신 커널을 사용하므로 이것를 사용할 것입니다.
-
원하는 패치 파일을 추출된 linux 디렉토리의 루트에 복사합니다.
.config파일과 같은 위치여야 합니다. -
patch -p1 < enable_additional_cpu_optimizations_for_gcc_v10.1+_kernel_v5.8+.patch
다음과 같은 출력을 볼 수 있습니다:
patching file arch/x86/Kconfig.cpu
patching file arch/x86/Makefile
patching file arch/x86/Makefile_32.cpu
...
- 이제 이전 설정의 4단계부터 시작할 수 있으며 다음을 볼 수 있습니다:
- 프로세서 유형 및 기능(Processor type and features)
- 프로세서 계열(Processor family)
- GCC에 의해 자동 감지된 네이티브 최적화(Native optimizations autodetected by GCC)
- 프로세서 계열(Processor family)
스케줄링 관련과 같은 다른 패치도 적용할 수 있습니다. 다시 한번, 시스템에 맞는 패치를 찾아보세요.
직접 컴파일한 커널 제거하기
마지막으로 작동했던 커널을 유지하려고 노력하세요. 즉, 최소 두 개의 커널(현재 사용 중인 것과 이전 버전)을 확보하는 것이 좋습니다.
주의: 현재 실행 중인 커널(uname -r로 확인 가능)을 제거하면 시스템이 부팅되지 않게 됩니다.
- 다음 항목들을 제거해야 합니다:
/boot/vmlinuz-x.x.x-x
/boot/initrd-x.x.x-x
/boot/System-map-x.x.x-x
...
2. `sudo grub2-mkconfig -o /boot/grub2/grub.cfg` 또는 `sudo update-grub2` 또는 `sudo update-grub`을 실행합니다.
## Btrfs 파일 시스템 최적화
1. `sudo gedit /etc/fstab`을 실행하여 다음과 유사하게 변경합니다 (이 설정은 fedora 기준이며, 사용자의 환경에 따라 다를 수 있습니다):
```shell
UUID=<변경하지 않을 값> / btrfs subvol=root,x-systemd.device-timeout=0,ssd,noatime,space_cache,commit=120,compress=zstd,discard=async,lazytime 0 0
UUID=<변경하지 않을 값> /boot ext4 defaults 1 2
UUID=<변경하지 않을 값> /boot/efi vfat umask=0077,shortname=winnt 0 2
...
선택 사항:
nobarrier
nobarrier 옵션은 갑작스러운 전원 손실이 예상되거나 배터리 백업 기능이 없는 경우에 안전합니다.
휘발성 배터리 백업 쓰기 캐시가 있는 장치에서, nobarrier 옵션은 보류 중인 블록들이 영구 저장소에 도달할 것으로 가정하므로 파일 시스템 손상을 초래하지 않습니다. man 5 btrfs.
-
sudo systemctl daemon-reload를 실행합니다. -
sudo systemctl enable fstrim.timer를 실행합니다.
부팅 매개변수 변경하기
중요: 저는 보통 mitigations 기능을 비활성화하는 것을 선호하지만, 다시 말해 저는 AMD 기반 CPU를 사용하며 Meltdown만 있고 Spectre는 없습니다. 또한 알 수 없는 스크립트를 실행하지 않으며, 설령 해야 한다 하더라도 컨테이너와 noscript가 적용된 firefox 및 몇 가지 다른 보안 추가 기능(add-ons)을 사용합니다. 그럼에도 불구하고, 보안상의 우려 사항을 이해한다면 이를 비활성화하여 성능의 현저한 향상을 볼 수 있습니다.
`sudo grubby --args
sudo update-grub
재부팅 후에는 cat /proc/cmdline을 실행하여 부팅 옵션을 확인할 수 있습니다.
부팅 시간 개선하기
이전의 조정으로 어느 정도 개선되었지만, 좀 더 시도해 봅시다.
-
시작 애플리케이션 제거하기; 저는 GUI와 같은 경험을 위해
gnome-tweaks를 사용합니다. -
다음 명령어를 실행하여 어떤 서비스가 가장 오래 걸리는지 찾습니다:
systemd-analyze systemd-analyze blame systemd-analyze critical-chain
이것들은 시스템과 배포판마다 다를 수 있습니다. 제 경우(fedora)에는 dnf-makecache.service가 약 32s를 소요하는 것을 비활성화했습니다. 그렇게 하려면:
shell sudo systemctl disable NetworkManager-wait-online.service sudo systemctl disable dnf-makecache.service sudo systemctl disable dnf-makecache.timer ...
- 비활성화할 것이라고 생각하는 모든 서비스에 대해 구글링하여 그것이 무엇을 하는지 아는 것이 좋습니다; 제 경우, 단순히 dnf 캐시를 업데이트하는데, 저는 보통 이 작업을 수동으로 하고 싶습니다.
- 저는
NetworkManager-wait-online.service를 비활성화하는 것을 좋아합니다. 이것은 로그인 화면을 표시하기 전에 네트워크가 온라인 상태가 될 때까지 기다립니다. 이를 비활성화하면 비밀번호를 입력하는 동안 시스템이 인터넷에 연결됩니다 :p.
swappiness 변경하기
8GB 이상의 RAM이 있다면 도움이 될 수 있지만, 그렇지 않다면 그대로 두세요.
-
현재 swappiness를 보려면
cat /proc/sys/vm/swappiness를 입력합니다;60이 출력되어야 합니다; 우리는 이것을 10으로 만들고 싶습니다. -
sudo gedit /etc/sysctl.conf. -
vm.swappiness=10을 입력하고 재부팅합니다; 이제 1단계는 10을 출력해야 합니다.
scaling_governor를 performance로 변경하기
Ryzen 기반 CPU에서는 performance로 변경하지 마십시오. 성능에 손상을 줄 수 있습니다 (저는 AC에서 더 나은 성능을 얻는 것 같지만, 다시 말해서 performance가 어떤 경우에는 터보 부스트를 허용하지 않는 것 같습니다) ondemand 또는 schedutil을 사용하는 것이 더 좋습니다 (schedutil 쪽으로 기울고 있습니다. 곧 fixed가 되면서)). 저는 balanced보다 performance로 했을 때 1% 저점이 더 좋았습니다.
-
현재의 거버너를 확인하려면
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor를 실행하세요. -
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor를 실행합니다.
이 설정은 다음 부팅 시 유지되지 않을 가능성이 높습니다. 저는 systemd 서비스를 만드는 것보다 수동으로 변경하는 것을 선호합니다 (저는 노트북을 사용하기 때문에 발열 문제가 있습니다). 만약 영구적으로 적용하고 싶다면 사용하는 배포판에 맞춰 검색해 보시는 것이 좋습니다. 또는:
echo 'GOVERNOR="performance"' | sudo tee /etc/default/cpufrequtils
sudo systemctl disable schedutil
기본값은 schedutil이며, 다른 옵션들은 여기에서 확인할 수 있습니다.
참고: 커널 컴파일 시 기본값을 변경할 수도 있습니다.
그래픽 성능 개선
그래픽 카드는 까다롭습니다. AMD에 대한 지원이 가장 좋으며, 반면 NVIDIA는 적어도 현재로서는 레이 트레이싱(ray tracing)과 프레임 생성(frame-gen) 분야에서 우위를 점하고 있습니다.
GPU의 성능을 높이기 위해 오버클러킹(overclocking)하거나 언더볼팅(undervolting)을 시도해 볼 수 있지만, 효과는 사람마다 다를 수 있습니다.
power-profiles-daemon을 설치하고 전원 프로필 표시 앱릿을 설치하세요 (대부분의 배포판에 사전 설치되어 있어야 합니다). → 게임 중에는Performance로 설정합니다.
AMD
사용하는 GPU에 특화된 오버클러킹 도구를 찾을 수 있지만, 그래픽 카드가 OS(특히 AMD)에 의해 성능이 제한되고 있지 않은지 확인해야 합니다:
- 이것이
auto인지 확인하기:
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub GameDev의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기