리눅스 커널의 스케줄러는 프로세스의 우선순위를 바탕으로 CPU 시간을 나눠 준다. 이 우선순위를 사용자가 직접 건드릴 수 있는 가장 대표적인 도구가 nice와 renice다.
기본 아이디어는 간단하다.
중요한 작업은 상대적으로 높은 우선순위를 주고 긴 시간 걸리는 백그라운드 작업은 낮은 우선순위로 돌려 다른 작업에 끼치는 영향을 줄이는 것이다.
특히 다음 상황에서 nice와 renice는 강력한 도구가 된다.
- 로그 분석이나 대량 빌드처럼 CPU를 오래 쓰는 배치 작업
- 같은 서버에 여러 사람이 접속해 작업하는 개발 서버
- 모니터링 에이전트와 애플리케이션이 섞여 있는 운영 서버
이제 개념과 명령 사용법을 차근차근 짚어보자.
목차
nice 값과 우선순위 개념 이해
리눅스에서 프로세스 우선순위는 크게 두 가지 축으로 볼 수 있다.
- 커널이 내부적으로 사용하는 스케줄링 우선순위
- 사용자가 조정하는 nice 값
nice 값 범위는 보통 마이너스 20에서 플러스 19까지다. 숫자가 작을수록 더 높은 우선순위를 의미하고 숫자가 클수록 더 낮은 우선순위를 의미한다.
정리하면 다음과 같다.
- 기존보다 더 빨리 돌리고 싶다
- nice 값을 낮춘다
- 다른 작업에게 양보하게 만들고 싶다
- nice 값을 높인다
일반 사용자 권한으로는 보통 nice 값을 높이는 방향만 허용된다. 마이너스 값처럼 더 높은 우선순위를 주는 작업은 보안상 위험할 수 있기 때문에 관리자 권한이 필요하다.
nice 명령으로 새 프로세스 우선순위 지정
기본 사용법과 동작 방식
nice 명령은 새 프로세스를 실행할 때 처음부터 특정 nice 값으로 시작하도록 만들어 준다. 형식은 매우 단순하다.
nice -n 10 명령어 인자들
여기서 마이너스 엔 옵션 뒤 숫자 10은 해당 프로세스를 기본값보다 조금 더 낮은 우선순위로 실행하겠다는 의미다.
예를 들어 대용량 로그 파일을 압축할 때 다음처럼 실행할 수 있다.
nice -n 10 gzip access.log
이렇게 하면 gzip이 CPU를 많이 쓰더라도 다른 인터랙티브 작업이나 중요한 서비스가 먼저 CPU를 배분받기 쉬워진다.
우선순위를 낮춰야 할 대표적인 작업들
nice를 미리 걸어두면 좋은 작업 유형을 몇 가지 살펴보면 감이 더 잘 온다.
- 소스 코드 전체를 다시 빌드하는 빌드 작업
- 오래 걸리는 테스트나 배치 스크립트
- 로그 압축이나 대용량 데이터 변환
- 단발성 벤치마크나 실험용 스크립트
이런 작업은 실행 시간이 길고 CPU를 많이 쓰는 경우가 많다. 그냥 실행하면 서버의 다른 사용자나 서비스가 느려질 수 있으니 nice로 한 단계 양보하도록 만드는 것이 좋다.
실전 예시 개발 서버에서의 활용
여러 개발자가 함께 쓰는 서버에서 한 사람이 빌드를 돌렸다고 해보자.
단순히 빌드를 이렇게 실행하면
make
빌드 프로세스가 CPU를 거의 독점해 다른 사람의 쉘 반응도 느려질 수 있다. 이를 피하려면
nice -n 10 make
처럼 실행하는 습관을 들이는 편이 좋다. 빌드 시간은 조금 늘어날 수 있지만 서버 전체 관점에서는 훨씬 부드러운 운영이 가능해진다.
renice 명령으로 실행 중인 프로세스 우선순위 변경
실행 중 프로세스를 대상으로 동작
renice는 이미 실행 중인 프로세스의 nice 값을 변경할 때 사용하는 명령이다. 기본 형식은 다음과 같다.
renice 새로운값 -p PID
예를 들어 프로세스 아이디가 1234인 작업의 우선순위를 낮추고 싶다면
renice 10 -p 1234
처럼 입력하면 된다.
여기서도 일반 사용자는 자신이 실행한 프로세스를 더 느리게 만드는 방향으로만 조정할 수 있고 우선순위를 높이는 작업은 관리자 권한이 필요하다.
top이나 ps와 함께 사용하는 패턴
실제 상황에서는 보통 다음 흐름으로 renice를 사용하게 된다.
- top이나 htop으로 CPU를 많이 쓰는 프로세스를 찾는다
- 해당 프로세스의 PID를 확인한다
- renice로 우선순위를 낮춘다
예를 들어 top에서 특정 파이썬 스크립트가 CPU를 오래 잡고 있는 것이 보이면, PID를 확인한 뒤 다음과 같이 입력한다.
renice 15 -p 9876
이렇게 하면 프로세스는 계속 돌아가지만 CPU 양보를 더 많이 하게 된다.
ps 명령을 곁들여 쓰는 패턴도 자주 보인다.
ps -o pid,ni,cmd -C python
이 명령으로 현재 파이썬 프로세스들의 PID와 nice 값을 확인한 다음, 과도하게 CPU를 쓰는 프로세스에만 선택적으로 renice를 걸 수 있다.
프로세스 그룹과 사용자 기준으로 변경하기
renice는 PID뿐 아니라 프로세스 그룹이나 사용자 단위로도 동작한다.
예를 들어 특정 사용자 계정이 실행한 모든 프로세스를 한 번에 낮은 우선순위로 돌리고 싶다면
sudo renice 10 -u 사용자이름
처럼 사용할 수 있다.
또는 하나의 작업이 여러 하위 프로세스를 포크하는 경우 프로세스 그룹 단위로 우선순위를 조정해 전체 묶음을 한 번에 조절하기도 한다.
실전 상황별 nice와 renice 활용 시나리오
로그 분석과 대용량 배치 작업
운영 서버에서 하루치 로그를 모아서 집계하는 작업은 CPU와 디스크를 모두 많이 쓰는 경우가 많다. 이 작업이 서비스 피크 시간대와 겹치면 응답 지연이 발생할 수 있다.
이럴 때는 배치 스크립트 내부에서 아예 nice를 기본값으로 넣어두는 것이 안전하다.
nice -n 10 python aggregate_logs.py
여기에 cron이나 시스템 타이머를 조합하면 사람이 매번 신경 쓰지 않아도 항상 적절한 우선순위로 작업이 실행된다.
데이터 과학이나 머신러닝 실험 환경
개발 서버 한 대에 여러 명이 접속해 머신러닝 실험을 돌릴 때도 nice는 필수에 가깝다.
예를 들어 학습 스크립트를 다음처럼 실행할 수 있다.
nice -n 5 python train.py
이렇게 하면 학습 작업이 CPU를 꽉 채우더라도 다른 사람의 쉘 작업이나 에디터, 간단한 테스트 실행에 필요한 CPU 시간을 조금은 남겨 둘 수 있다.
실험 속도가 조금 느려지는 대신 팀 전체의 행복도가 올라간다고 생각하면 설득하기도 쉬운 편이다.
갑자기 폭주하는 프로세스 진정시키기
버그가 있는 스크립트나 잘못 설정된 서버 프로세스가 갑자기 CPU를 꽉 채워 서버 전체가 버벅이는 상황도 종종 발생한다.
당장 프로세스를 죽이기에는 위험하지만, 일단 서버를 살려 두고 로그를 더 살펴보고 싶다면 우선순위를 낮춰 숨을 돌릴 수 있다.
- top으로 문제 프로세스 PID 확인
- renice로 우선순위 대폭 하향
sudo renice 19 -p 4321
이렇게 하면 해당 프로세스는 여전히 실행되지만 남는 틈틈이만 CPU를 가져가므로 다른 작업을 하면서 천천히 원인을 분석할 수 있다.
우선순위 설정 시 주의할 점과 팁
너무 낮게만 설정하는 것이 항상 좋은 것은 아니다
nice 값을 높게 주면 다른 작업에 피해를 덜 주는 것처럼 보이지만, 과도하게 올리면 오히려 전체 시스템에 악영향을 줄 수 있다.
예를 들어 백그라운드 작업이 디스크나 네트워크와 엮여 있다면, 작업 시간만 지나치게 길어지고 I O 큐만 계속 점유하면서 애매한 병목을 만드는 경우도 있다.
일반적으로 다음 정도를 기준으로 생각해 볼 수 있다.
- 살짝 양보
- 플러스 5 전후
- 눈에 띄게 양보
- 플러스 10 전후
- 정말 한가할 때만 돌려도 되는 작업
- 플러스 15 이상
환경마다 체감이 다르니 한 번에 극단적으로 바꾸기보다 단계적으로 조정해 보는 편이 좋다.
시스템 서비스의 우선순위를 함부로 올리지 않기
데이터베이스나 웹 서버 같은 핵심 서비스의 우선순위를 올리면 좋아 보일 수 있지만, 동시에 커널의 다른 중요한 작업들보다 지나치게 많은 CPU 시간을 가져갈 위험도 있다.
특히 여러 서비스가 얽혀 있는 복잡한 환경에서는 어느 한 서비스만 우선순위를 무리하게 올리기보다는 성능 튜닝과 리소스 배분 설계를 먼저 고민하는 것이 더 안전하다.
cron과 스크립트에 nice를 녹여 두기
매번 명령 앞에 nice를 붙이는 것은 쉬울 것 같지만 사람이 하는 일이라 언젠가는 빠지기 마련이다.
그래서 자주 돌아가는 배치 작업이나 팀 공용 스크립트에는 처음부터 nice를 포함해 두는 것이 좋다.
#!/bin/bash
nice -n 10 /usr/local/bin/heavy_task.sh
혹은 cron 엔트리에서 바로 사용해도 된다.
0 3 * * * nice -n 10 /usr/local/bin/daily_job.sh
이렇게 하면 사람이 실수할 여지 없이 항상 동일한 우선순위 정책이 유지된다.
마무리 정리
nice와 renice는 리눅스에서 CPU 우선순위를 제어하는 가장 기본적인 도구지만, 실제 운영과 개발 환경에서는 의외로 소홀히 다뤄지는 경우가 많다.
새로 실행하는 프로세스의 우선순위는 nice로, 이미 실행 중인 프로세스의 우선순위는 renice로 조정할 수 있고 이 두 가지를 적절히 조합하면
- 긴 배치 작업은 다른 작업에 양보하게 만들고
- 인터랙티브 작업과 핵심 서비스는 보다 부드럽게 반응하도록 만들며
- 갑자기 폭주하는 프로세스를 잠시 진정시키는 완충 장치까지 마련할 수 있다.
결국 포인트는 내 작업만 빠르게 돌리는 것이 아니라 같은 서버를 쓰는 사람들과 서비스 전체를 함께 고려하는 것이다.
지금 사용하는 서버에서 CPU를 오래 잡고 있는 작업이 있다면 오늘 당장 nice와 renice를 한 번 적용해 보고, 환경에 맞는 우선순위 기준을 팀 차원에서 정리해 두는 것을 권장한다.