"가장 큰 프로세스를 죽이십시오"버튼


14

이 랩탑에는 SSD가 있으므로 스왑을 생략하기로 결정했습니다. 이것은 대부분의 경우 잘 작동하지만 때로는 RAM이 약간 짧아지고 컴퓨터가 실제로 느려지고 얼어 붙는 경향이 있습니다. 충분히 빨리 정지되는 것을 감지 할 수 있도록 커널로 바로가는 "가장 큰 프로세스 종료"버튼을 구현할 수있는 방법이 있습니까? 또는 컴퓨터이기 때문에 얼어 붙어 가장 큰 프로세스 자체를 촬영하기 시작할 때의 휴리스틱도 괜찮을 것입니다.


"가장 큰 프로세스 죽이기"명령을 의미합니까?
Ramesh

리눅스는 이것을 가지고 있습니다. OOM 킬러라고합니다. 그러나 메모리 오버 커밋을 활성화해야합니다 (대부분의 배포판에서는 기본적으로 켜져 있습니다).
Patrick

@Patrick는 overcommit_memory이다 0, overcommit_ratio입니다 50.
Reactormonk

답변:


12

귀하의 의견으로는 시스템이 스와핑되는 것처럼 들립니다.

리눅스는 OOM 킬러를 가지고 있는데,이 시스템은 시스템이 메모리를 오버 커밋하고 호출 할 때 호출된다.
리눅스는 기본적으로 메모리 오버 커밋을 수행하는데, 이는 기본적으로 시스템이 실제로 가지고있는 것보다 더 많은 메모리를 제공한다는 것을 의미합니다. 프로그램이 실제로 요청한 모든 메모리를 사용하지 않는다는 가정하에이를 수행합니다. 그러나 시스템에 메모리가 부족하면 이미 실행중인 다양한 프로세스에 메모리가 있다고 알려주므로 더 이상 거부 할 수 없습니다. 대신 OOM 킬러를 호출하는 것입니다. OOM 킬러는 기본적으로 커널이 메모리 부족 조건을 완화 할 것이라고 생각하는 프로세스를 찾습니다. 일반적으로 이것은 가장 많은 양의 메모리를 사용하는 프로세스이지만 알고리즘은 실제로 그보다 훨씬 복잡합니다.

당신이 한 이후 overcommit_memory로 설정 0(자동 모드), 커널은 메모리 오버 커밋을 수행하고 있습니다. 설명 된 동작에서 시스템이 크게 바뀌는 것처럼 들립니다.

여기에는 두 가지 옵션이 있습니다.

스왑 감소

시스템에 RAM이 부족하여 커널이 스왑을 시작합니다. 시스템의 스왑이 부족하면 OOM 킬러를 호출합니다. 그러나 사용 가능한 스왑 공간이 남아 있기 때문에 이런 일이 발생하지 않습니다.

당신의 원래 아이디어는 수동으로 프로세스를 죽입니다.

시스템이 너무 많이 스왑되고 있다고 생각할 때 프로세스를 수동으로 종료 할 수 있습니다. 이것은 커널 SysRq 트리거를 통해 수행 할 수 있습니다.

커널에는 "magic SysRq"라고하는 것이 있습니다. 이것은 커널에게 일종의 비상 작업을 수행하도록 지시하는 약간의 기능입니다. "모든 볼륨을 읽기 전용으로 마운트 해제", "모든 파일 시스템 동기화"또는 "지금 재부팅"과 같은 것이 될 수 있습니다. 이러한 옵션 중 하나는 OOM 킬러를 호출하는 것입니다.

커널에 매직 SysRq가 활성화 된 경우 (커널 옵션 CONFIG_MAGIC_SYSRQ) 두 가지 방법으로이를 수행 할 수 있습니다.

  1. Alt+ SysRq+ f
    키보드에서이 3 개의 키를 누르기 만하면됩니다.
  2. echo f > /proc/sysrq-trigger
    이것은 키보드 방법과 똑같은 작업을 수행하지만 프로그래밍 방식으로 수행합니다.

또한 스왑을 완전히 비활성화 할 수 있으며 이것이 대부분의 시스템에서 수행하는 작업이며 정확한 이유입니다. 스왑은 커널이 사용되지 않는 데이터를 선제 적으로 스왑하여 캐싱에 더 많은 램을 사용할 수 있다는 점에서 유리합니다. 그러나 그것은 당신이보고있는이 강제 교환 문제로 이어집니다.

개인적으로 가장 좋은 해결책은 강제 스왑에서 OOM 킬러를 호출하는 일종의 커널 옵션이라고 생각합니다. 기본적으로 선제 적 스왑이 작동하도록하지만 RAM이 부족하여 커널이 스왑으로 이동해야하는 경우 OOM 킬러를 호출하십시오.
불행히도 이것은 나의 개인적인 소망일뿐입니다. 이 작업을 수행하지 않습니다.


OOM Killer에 대해 몰랐습니다. top또는 ps명령을 사용하여 메모리 사용을 지속적으로 모니터링하는 스크립트를 생각하고 특정 임계 값 제한을 초과하면 명령을 사용하여 해당 프로세스를 종료 kill합니다.
Ramesh

스왑을 사용하지 않습니다.
Reactormonk

oom killer에 의해 어떤 프로세스가 종료되었는지 확인하려면 :grep -E "oom-killer|Killed process" /var/log/syslog /var/log/syslog.1
lesmana

@Tass 오, 나는 "스왑을 생략하기로 결정했다"라는 의견에 완전히 유념했다. 죄송합니다 :-(. "수동으로 프로세스를 죽이는"정보는 여전히 유효하지만 메모리가 부족할 때 속도가 느려지지 않아야합니다. 커널이 사물을 죽이는 것을 경험해야합니다
Patrick

@Patrick이 발생하지만 ~ 30 분 후.
Reactormonk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.