it-swarm-ko.tech

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

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

  • 소스가 없으므로 OS 측에서 모든 테스트를 수행해야합니다.
  • limitmemory 400k -p <pid>

유닉스에서 이것을 할 수있는 방법이 있습니까? 일반적인 유닉스 유틸리티는 훌륭 할 것입니다.

38
Lazer

ulimit -v, 셸 내장이지만 원하는대로해야합니다.

때로는 init 스크립트에서 사용합니다.

ulimit -v 128k
command
ulimit -v unlimited

그러나 프로그램이 실행되는 동안 할당 가능한 최대 메모리를 조작하는 방법을 원한다고 생각하십니까? 우선 순위를 조작하기위한 renice와 같은 것입니다.

그러나 내 지식에는 그러한 도구가 없습니다.

27
polemon

프로그램을 시작할 때 제한을 설정하려면 polemon 으로 표시된대로 ulimit -v 400를 사용하십시오. 이렇게하면 셸과 모든 하위 항목에 대한 제한이 설정되므로 스크립트에서 (ulimit -v 400; myprogram)와 같은 것을 사용하여 범위를 제한 할 수 있습니다.

실행중인 프로세스의 한계를 변경해야하는 경우에는 해당 유틸리티가 없습니다. setrlimit 시스템 호출을 실행하려면 프로세스를 가져와야합니다. 항상 안정적으로 작동하는 것은 아니지만 디버거를 사용하여 수행 할 수 있습니다. gdb를 사용하여이를 수행하는 방법은 다음과 같습니다 (여기서는 9는 Linux에서 RLIMIT_AS의 값입니다).

gdb -n -pid $pid -batch -x /dev/stdin <<EOF
call setrlimit(9, {409600, -1})
detach
quit
EOF

잘 모르겠지만 cgroups 를 사용하여 메모리 사용 을 제한 할 수도 있습니다. cgroup의 장점은 이미 실행중인 프로세스를 제어 할 수 있다는 것입니다. 그런데 systemd 는 cgroup을 사용하여 시스템 서비스를 제어합니다.

불행히도 나는 약간의 실험을했는데 Fedora 13 시스템에서 잘 작동하지 않는 것 같습니다.

11
Cristian Ciupitu

커널> = 2.6.36 및 util-linux> = 2.21 인 Linux 시스템에서 prlimit 명령을 사용하여 프로세스 자원 한계를 설정할 수 있습니다.

prlimit --rss=400000 --pid <pid>
9
Luca Gibelli

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=50M, 이는 50MiB로 제한됩니다.

그리고 이것은 결과입니다 :

# 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...

지금까지 이것은 시스템 데몬/서비스에서만 작동하며, 예를 들어 파이어 폭스는 이런 방식으로 일반 사용자로 처리하는 것을 제한 할 수 없습니다. 그러나 아마도 이것은 언젠가 변경 될 것입니다 .

3
Mikhail Morfikov

C에서 프로세스 제한을 구성 할 수있는 setrlimit () 함수 가 있습니다. setrlimit를 호출 한 다음 제한하려는 명령을 실행하도록 C 프로그램을 작성하십시오. setrlimit는 다른 프로세스의 한계를 변경할 수 없습니다.

다행히 누군가가 이미 비슷한 것을 썼습니다. freshmeat 에서 다운로드 할 수 있습니다. 소스 코드를 간략히 살펴 보았지만 괜찮은 것 같습니다. 귀하의 재량에 따라 rlimit를 사용하십시오. rlimit는 다른 프로세스의 한계도 변경할 수 없습니다.

편집 : Gilles는 gdb로 멋진 해킹을 제안했습니다. gdb로 프로세스에 첨부 한 다음 프로세스 호출을 setrlimit로 설정하십시오. 이것은 이미 실행중인 프로세스를 제한하기 위해 문제를 해결할 것입니다.

1
nalply

프로그램의 메모리 사용량을 테스트하고 측정하려면 time 을 참조하십시오. CPU 시간 및 메모리 사용량과 같은 여러 측면에서 프로그램의 자원 사용량을 측정 할 수 있습니다. 다음 명령은 myProgram의 메모리 사용량과 CPU 시간 사용량을 제공합니다.

/usr/bin/time myProgram

bash 내장 시간 명령과 구별 할 수있는 절대 경로를 제공하십시오.

프로세스의 리소스를 제한하려는 경우이 특정 작업에 대한 테스트 사용자를 만드는 것이 좋습니다. 필요에 따라이 사용자의 자원을 제한하고 사용자가 프로세스를 실행하십시오. * nix 세계에서 사용자 기반 자원 관리는 프로세스 기반 자원 관리보다 훨씬 고급 인 것 같습니다.

당신은 확인할 수 있습니다 /etc/security/limits.conf 사용자의 리소스를 제한합니다. 또는 제한 대상 사용자로 로그인 한 후 ulimit을 (를) 사용할 수 있습니다.

0
memin