
큰 CPU 및 메모리 소비 프로세스 트리를 시작하는 스크립트가 있습니다. 거기에는 Python과 실행 파일이 있지만 모든 것은 단일 bash 스크립트와 Python 하위 프로세스로 시작됩니다.
실행 중에는 나머지 시스템이 완전히 차단됩니다. 으로 완화하려고 시도했지만
$ nice -n10 ionice -c2 ./Script.sh
이것만으로는 충분하지 않습니다. 컴퓨터를 사용하는 것이 매우 지연됩니다(실제로 이는 개발 데스크톱이지만 지정된 서버의 문제도 동일합니다).
나는 문제가 많은 메모리를 사용하는 프로세스에 있다고 생각합니다. 결국 모든 것이 교체되고 느려집니다.
실제 메모리에 액세스할 때 프로세스(및 해당 재귀 하위 항목)의 우선순위를 낮추는 방법이 있습니까? 나는 다른 작업에 대한 영향이 제한되어 백그라운드에서 느리게 수행되는 것을 선호합니다.
답변1
메모리 소비의 "속도"를 제한할 수는 없지만 다양한 메커니즘을 통해 총 메모리 사용량을 제한할 수 있습니다.
1) 보안 제한 /etc/security/limits.conf를 통해 프로세스를 실행하는 사용자의 메모리 사용량을 제한합니다. 다른 작업을 수행하는 동일한 사용자로 이 프로세스를 실행하는 경우에는 작동하지 않을 수 있습니다.
예:
username hard as 1000000
2) 그룹 제어 - cgroup을 사용하여 그룹을 생성하고 메모리 사용량을 제한할 수도 있습니다. 다음과 같이 cgroup을 생성하세요.
# cat >> /etc/cgconfig.conf << EOF
group memlimit {
memory {
memory.limit_in_bytes = 1073741824;
}
}
EOF
# cat >> /etc/cgrules.conf <<EOF
username memory memlimit/
EOF
오프코스 - 두 경우 모두 더 많은 메모리 할당 실패를 복구할 수 있도록 프로그램을 개발해야 합니다.
그렇지 않은 경우 시스템에 메모리를 추가하면 교체를 피할 수 있습니다. 일단 스와핑이 시작되면 커널의 손에 들어가게 되며, 예를 들어 kswapd의 우선순위를 낮출 수 없습니다. 가능하더라도 사용하는 일부 프로그램이 여전히 스와핑되지 않는다는 보장은 없습니다. 결과적으로 시스템 응답 속도가 더욱 느려집니다. 그냥 거기 가지 마세요.
답변2
다음은 메모리 스와핑에 도움이 되지 않지만 프로세스의 IO 영향에 도움이 될 것입니다.
명시적으로 설정해야 할 것 같습니다 level
.
ionice -c2 -n5 ./slowscript.sh
커널에 따라 C2만으로는 충분하지 않을 수 있습니다.
맨페이지에서 인용( man ionice
)
Note that before kernel 2.6.26 a process that has not asked for an I/O priority formally uses "none" as scheduling class, but the I/O scheduler will treat such
processes as if it were in the best-effort class. The priority within the best-effort class will be dynamically derived from the CPU nice level of the process:
io_priority = (cpu_nice + 20) / 5.
For kernels after 2.6.26 with the CFQ I/O scheduler, a process that has not asked for an I/O priority inherits its CPU scheduling class. The I/O priority is
derived from the CPU nice level of the process (same as before kernel 2.6.26).
기본적으로 새로 시작된 모든 프로세스는 C2 N4를 얻게 되므로 IO를 가능한 한 낮게 줄이려면 유휴 전용(C3) 또는 C2 N7로 이동하세요.