이것은 정지 프로세스/SIGSTOP에 관한 질문만큼이나 많습니다.stress
그래서 저는 시스템의 메모리 압력을 시뮬레이션하기 위해 압력을 사용하고 있습니다.
stress --vm X --vm-bytes YM
이것은 잘 작동하지만 CPU를 많이 소모하는 것으로 나타났습니다.
root@ET0021B703EB23:~# ps -aux | grep stress
root 11800 0.0 0.0 2192 232 pts/4 S+ 15:21 0:00 stress --vm 1 --vm-bytes 10M
root 11801 83.5 0.2 12436 2436 pts/4 R+ 15:21 0:03 stress --vm 1 --vm-bytes 10M
이제 이번 테스트에서는 CPU 부하에 대해 걱정하고 싶지 않습니다. Ctrl+를 사용하여 Z일시 중지했는데 이제 stress
소비된 CPU가 감소했지만 메모리는 여전히 내가 원하는 대로 남아 있습니다.
root@ET0021B703EB23:~# ps -aux | grep stress
root 9080 0.0 0.0 2760 296 pts/2 S+ 15:18 0:00 grep stress
root 17030 0.0 0.0 2192 172 pts/2 T 14:51 0:00 stress --vm 1 --vm-bytes 10M
root 17031 2.7 0.4 12436 4860 pts/2 T 14:51 0:44 stress --vm 1 --vm-bytes 10M
내가 이해하는 바로는 프로세스를 일시 중지 상태로 유지하면 메모리에 유지됩니다. 그렇다면 이 접근 방식을 사용하여 CPU 비용 없이 메모리 부족을 안정적으로 시뮬레이션할 수 있습니까?
내 관심사는 Linux에 메모리 압박으로 인해 중단된 프로세스를 종료하거나 메모리에 미치는 영향을 제거하는 기능(예: Android의 lowmemorykiller)이 있는지 여부입니다. 그런 것이 존재합니까, 아니면 이것이 작동하지 않는 이유가 있습니까?
답변1
내가 찾은이 오라클 기사OOM Killer 정보(Out Of Memory Killer)는 특히 "OOM Killer 구성" 장에서 질문의 절반에 대한 답변을 제공합니다.
나는 거기에서 두 가지 중요한 명령을 추출했습니다.
- OOM Killer 비활성화
root@host:~# sysctl vm.overcommit_memory=2
- OOM Killer에서 프로세스 제외
root@host:~# echo -17 > /proc/<pid>/oom_adj
다른 매우 흥미로운 답변은 다음과 같습니다.1.4존재하다이 FAQ스트레스 항목 페이지에는 다음과 같이 나와 있습니다.
1.4 CPU는 손상되었으나 RAM은 손상되지 않는 이유는 무엇입니까?
이는 기본 옵션이 보수적일 경우 압력이 가해지기 때문입니다. 가상 메모리 관리자를 강제로 충돌시켜 시스템을 일시적으로 사용할 수 없게 만드는 것은 쉽습니다. 따라서 보유하고 있는 메모리 양을 확인하고 적절한 옵션을 전달하세요. 3GB RAM을 갖춘 듀얼 코어 Intel 시스템에서 합리적인 호출은 다음과 같습니다.
stress -m 1 --vm-bytes 2G
그런데 귀하의 질문에 아직 답변이 없습니다. 우리에게 보여줘압력 매뉴얼...
-c, --cpu N
sqrt()에서 회전하는 N 작업자 스레드를 생성합니다.
위 옵션이 도움이 될 수도 있습니다. 0으로 설정해 보세요. 이런, 이건 작동하지 않습니다! ?
코드를 살펴본 후 이 옵션이 기본적으로 비활성화되어 있음을 확인했습니다. 나도 눈치챘다--vm-항옵션은 원하는 것일 수 있습니다.
기본 동작은 다음과 같습니다.--vmmalloc()/free()에서 회전하고 있으며 CPU를 많이 사용합니다!--vm-항만들다압력프로그램이 일시 중지됩니다.초는 매번 할당됩니다.무료().
다음 명령을 사용해 보십시오(~128MB RAM 소비).
root@host:~# stress --vm 1 --vm-bytes 128000000 --vm-hang 3600
다른 터미널에서 테스트해 보십시오.
root@host:~# top