Unix에서 특정 프로세스가 사용할 수 있는 메모리 양을 제한하는 방법이 있습니까? [복사]

Unix에서 특정 프로세스가 사용할 수 있는 메모리 양을 제한하는 방법이 있습니까? [복사]

메모리 관리 프로세스를 테스트해야 합니다.

  • 소스 코드가 없으므로 OS 측에서 모든 테스트를 수행해야 합니다.
  • 다음과 같은 말을 할 수 있었으면 좋겠다limitmemory 400k -p <pid>

유닉스에서 이것을 할 수 있는 방법이 있나요? 일반적인 UNIX 유틸리티라면 모두 좋습니다.

답변1

ulimit -v, 이는 쉘 내장이지만 원하는 작업을 수행해야 합니다.

나는 때때로 초기화 스크립트에서 이것을 사용합니다:

ulimit -v 128k
command
ulimit -v unlimited

그런데 프로그램이 실행되는 동안 최대 할당 가능한 메모리를 조작할 수 있는 방법을 원하는 것 같죠? 아마도 우선순위를 조작하는 것과 같을 것입니다 renice.

그러나 내가 아는 한 그러한 도구는 없습니다.

답변2

커널이 2.6.36 이상이고 util-linux가 2.21 이상인 Linux 시스템에서는 다음을 사용할 수 있습니다.한계프로세스 리소스 제한을 설정하는 명령:

prlimit --as=400000 --pid <pid>

이는 프로세스가 사용할 수 있는 최대 가상 메모리 양을 400000으로 제한합니다. 에서 특정 프로세스에 대해 제한될 수 있는 리소스의 전체 목록을 찾을 수 있습니다 man 2 prlimit.

주석과 매뉴얼 페이지에 명시된 바와 같이 RSS 수를 제한하는 것은 커널 > 2.4.0 및 < 2.4.30에서는 효과가 없습니다.

답변3

Linux 시스템에서는 다음 위치에서 메모리 컨트롤러를 사용할 수 있습니다.대조군 버전 1또는버전 2.

체계쉽게 생각해리소스 사용량 제어, 특히 cgroups-v2가 있는 시스템에서는:

MemoryHigh=bytes

  이 장치에서 실행되는 프로세스에 대한 메모리 사용량 제한을 지정합니다. 부득이하게 메모리 사용량이 한도를 초과할 수도 있는데, 이 경우 프로세스 속도가 심하게 느려지고 메모리를 많이 차지하게 된다. 이는 단위 메모리 사용량을 제어하는 ​​기본 메커니즘입니다. […]

MemoryMax=bytes

  이 장치에서 실행되는 프로세스의 메모리 사용량에 대한 절대 한도를 지정합니다. 메모리 사용량을 제한 이하로 제어할 수 없는 경우 장치 내부에서 Out of Memory Killer가 호출됩니다. MemoryHigh=기본 제어 메커니즘과 MemoryMax=최후의 방어선 으로 사용하는 것이 좋습니다 . […]

MemoryLimit=bytes

  실행 중인 프로세스에 대한 최대 메모리 사용량 제한을 지정합니다. […]

  이 설정은 더 이상 사용되지 않습니다. 대신 사용하십시오 MemoryMax=.

완전한 서비스를 생성 및 사용자 정의하고 싶지 않고 단지 임시 명령을 실행하려는 경우 다음을 사용할 수 있습니다.시스템 실행 중사용자 제안 유틸리티안녕 천사:

systemd-run --scope -p MemoryMax=1G firefox

--scope

.scope기본 임시 요소 대신   임시 요소를 만듭니다 .service(위 참조).

--property=,-p

  생성한 범위 또는 서비스 단위의 속성을 설정합니다. 이 옵션은 systemctl(1)과 동일한 형식으로 할당을 받습니다.속성 설정주문하다.

답변4

systemd를 사용하는 경우 파일에서 몇 가지 추가 옵션을 설정할 수 있습니다 .service. 설정할 수 있는 옵션의 전체 목록여기에 설명하세요.

다음은 systemd의 이 기능을 사용하는 방법을 보여주는 간단한 예입니다.

# cat /etc/systemd/system/qbittorrent-nox.service
[Unit]
Description=qbittorrent-nox
Documentation=man:qbittorrent-nox
DefaultDependencies=yes
Requires=media-Kabi.mount
After=media-Kabi.mount network-online.target
Before=multi-user.target
Conflicts=umount.target

[Service]
User=morfik
Group=p2p
Type= simple
RemainAfterExit=no
ExecStart=/usr/bin/qbittorrent-nox
Nice=19
IOSchedulingClass=idle
PrivateNetwork=no
CPUShares=256
MemoryLimit=50M
BlockIOWeight=128
Slice=p2p.slice
StandardError=null
StandardOutput=null

[Install]
WantedBy=multi-user.target

물론 제가 사용한 옵션이 모두 필요하지는 않습니다. 메모리 사용량을 제한하려면 을 추가하고 MemoryLimit=50M50MiB로 제한하세요.

결과는 다음과 같습니다.

# systemctl status qbittorrent-nox.service
● qbittorrent-nox.service - qbittorrent-nox
   Loaded: loaded (/etc/systemd/system/qbittorrent-nox.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2015-05-07 19:25:20 CEST; 1s ago
     Docs: man:qbittorrent-nox
 Main PID: 21712 (qbittorrent-nox)
   Memory: 9.4M (limit: 50.0M)
   CGroup: /p2p.slice/qbittorrent-nox.service
           └─21712 /usr/bin/qbittorrent-nox

May 07 19:25:20 morfikownia systemd[1]: Started qbittorrent-nox.
May 07 19:25:20 morfikownia systemd[1]: Starting qbittorrent-nox...

지금까지 이는 시스템 데몬/서비스에만 작동하며, 예를 들어 Firefox를 이런 방식으로 일반 사용자 프로세스로 제한할 수 없습니다. 그러나 아마도이건 언젠가 바뀔거야.

관련 정보