La foret rouge

systemd-run을 이용한 Linux 프로세스 자원 사용량 제한

Published on
Published on

배경

Homelab 환경에 RAM을 2GB만 할당한 Rocky Linux 9 서버가 있습니다. NTP(chronyd) 하나만 실행 중이라 메모리가 그렇게 많이 필요하지 않기 때문입니다. 그런데 최근 새벽마다 Grafana에서 이 서버의 메모리 사용량이 할당량의 90%를 초과했다는 경고가 발생했습니다.

Grafana memory alert showing Rocky Linux server exceeding memory allocation threshold Grafana dashboard panel showing memory usage metrics for Rocky Linux server, with a red alert indicator and percentage values displaying memory consumption exceeding the 90% threshold warning level

알람이 오기 시작한 날짜와 시간을 보아하니, 새벽에 ClamAV 바이러스 스캔이 실행된 시점과 일치합니다. RAM Used가 1.18GB까지 증가했고, Swap Used가 1.98GB까지 증가했습니다. 사용할 수 있는 공간은 거의 다 사용했나보네요.

가장 빠른 해결 방법은 VM에 메모리를 더 할당하는 것입니다. 하지만 평소에는 메모리를 채 1GB도 사용하지 않는 서버에 바이러스 검사하는 한 시간도 되지 않는 시간을 위해 메모리를 더 할당하는 것은 비효율적입니다. 그리고 만약 이 서버에서 다른 서비스도 실행된다면 메모리 부족으로 인해 시스템 전체가 불안정해질 수도 있습니다.

다른 방법은 없을까요?

방법 조사

우선 지금의 조건을 정리해보겠습니다.

  • 평소에는 메모리를 아주 적게 사용
  • 바이러스 검사 시에만 메모리를 많이 사용
  • 바이러스 검사는 오래 걸려도 상관 없음

이런 조건을 만족하는 다른 방법은 프로세스의 자원 사용량을 제한하는 것입니다. ClamAV 바이러스 검사 프로세스가 실행되는 데 문제가 없을 정도로 자원 사용률을 제한하면 검사를 완료하는 데 시간은 조금 더 걸리겠지만 시스템 전체의 안정성은 유지할 수 있지 않을까요?

cgroups

현대 Linux 환경에서 프로세스의 자원 사용량을 제한하는 표준적인 방법은 cgroups(Control Groups)를 사용하는 것입니다. cgroups는 프로세스 그룹별로 CPU 시간, 메모리 사용량, 디스크 I/O 등 다양한 자원 사용량을 제한하고 모니터링할 수 있는 기능을 제공합니다.

systemd-run

이를 가장 쉽게 적용하는 방법은 systemd의 systemd-run 명령어를 사용하는 것입니다. systemd-run은 임시로 새로운 systemd 서비스 유닛을 생성하여 지정한 명령어를 실행할 수 있게 해줍니다1. 이때 cgroup 설정을 함께 지정하여 자원 사용량을 제한할 수 있습니다2.

systemd-run 명령어를 사용하여 프로세스를 실행할 때, -p 옵션을 사용하여 다양한 cgroup 프로퍼티를 설정할 수 있습니다34. 예를 들어, CPU 사용량을 제한하려면 CPUQuota 프로퍼티를, 메모리 사용량을 제한하려면 MemoryHigh 또는 MemoryMax 프로퍼티를 사용할 수 있습니다.

적용 및 테스트

ClamAV 바이러스 검사에 적용

저는 이전 ClamAV 바이러스 검사 설정에서 crontab을 이용해 검사를 실행하도록 설정하였습니다. 그래서 아래와 같이 crontab 내용을 수정하여 clamscan 명령어에 systemd-run을 적용해보았습니다.

crontab
# CPU 50%, 메모리 500MB로 제한하여 검사 실행
# crontab에서는 % 기호가 개행문자로 인식되므로 escape 필요
10 3 * * * systemd-run --scope -p CPUQuota=50\% -p MemoryHigh=500M clamscan -ri --exclude-dir='^/sys|^/proc|^/dev' / >> /var/log/clamav/clamscan.log 2>&1

결과 비교

  • 그냥 실행할 때: clamscan 프로세스가 cpu 75%, 메모리 75%(RES 1.3G) 사용.

    ----------- SCAN SUMMARY -----------
    Known viruses: 8708688
    Engine version: 1.4.3
    Scanned directories: 7436
    Scanned files: 47342
    Infected files: 0
    Data scanned: 6625.48 MB
    Data read: 3652.79 MB (ratio 1.81:1)
    Time: 1298.505 sec (21 m 38 s)
    Start Date: 2026:01:25 04:10:01
    End Date:   2026:01:25 04:31:39
    
  • CPU 50%, MemoryHigh 500M 제한 적용 후 clamscan 프로세스 cpu 25%, 메모리 29%(RES 510M) 사용. CPU 사용률은 검사하는 파일에 따라 계속 바뀌지만 최대 50%까지만 사용하는 것도 볼 수 있었습니다.

    ----------- SCAN SUMMARY -----------
    Known viruses: 3627269
    Engine version: 1.4.3
    Scanned directories: 7443
    Scanned files: 47349
    Infected files: 0
    Data scanned: 6670.85 MB
    Data read: 3622.37 MB (ratio 1.84:1)
    Time: 2375.654 sec (39 m 35 s)
    Start Date: 2026:01:25 14:52:02
    End Date:   2026:01:25 15:31:37
    

    프로세스가 사용할 수 있는 시스템 자원을 제한하더라도 문제 없이 잘 끝났고, 시간이 거의 두 배로 늘어나긴 했지만 40분 정도면 용인 가능한 수준이라 생각됩니다. 시간이 늘어난 것보다 자원 사용량을 제한하여 알람이 발생하지 않은 것이 더 중요합니다.

결론

systemd-run 명령어를 사용하여 바이러스 검사 프로세스의 CPU 및 메모리 사용량을 제한함으로써, 시스템 전체의 안정성을 유지하면서도 바이러스 검사를 성공적으로 수행할 수 있었습니다. 제한된 자원 내에서 프로세스가 실행되었기 때문에, 시스템이 과부하 상태에 빠지지 않았고, 알림도 발생하지 않았습니다. 한 서버에서 여러 작업이 동시에 실행되는 환경에서는 이러한 자원 제한이 특히 유용할 수 있습니다.

Footnotes

  1. "25.14. systemd-run 명령을 사용하여 일시적인 cgroup 생성," Red Hat Documentation, Accessed: Feb. 10, 2026. [Online]. Available: https://docs.redhat.com/ko/documentation/red_hat_enterprise_linux/9/html/managing_monitoring_and_updating_the_kernel/creating-transient-control-groups_assembly_using-systemd-to-manage-resources-used-by-applications

  2. "systemd를 사용하여 AL2023에서 프로세스 리소스 사용 제한," Amazon Linux 2023 사용 설명서, Accessed: Feb. 10, 2026. [Online]. Available: https://docs.aws.amazon.com/ko_kr/linux/al2023/ug/resource-limiting-systemd.html

  3. "systemd-run — Run programs in transient scope units, service units, or path-, socket-, or timer-triggered service units," freedesktop.org, Accessed: Feb. 10, 2026. [Online]. Available: https://www.freedesktop.org/software/systemd/man/latest/systemd-run.html

  4. "systemd.resource-control — Resource control unit settings," freedesktop.org, Accessed: Feb. 10, 2026. [Online]. Available: https://www.freedesktop.org/software/systemd/man/latest/systemd.resource-control.html