단일 또는 몇 가지 중요한 시스템 서비스 데몬으로 일부 Linux 서버를 실행하는 경우 이상한 일이 발생할 경우 데몬 프로세스에서 OOM 킬러를 조정하고 싶습니다. 예를 들어, 오늘날 MySQL을 실행하는 일부 Ubuntu 서버는 수많은 apt-checker
프로세스 가 모든 메모리 를 소비하고 커널이 MySQL을 죽이는 것이 좋다고 생각 했기 때문에 MySQL 데몬을 종료 했습니다.
나는 /proc/$(pidof mysqld)/oom_score_adj
파일을 사용하여 점수를 조정하여 커널이 MySQL을 죽이기를 원하지 않는 단서를 제공 할 수 있지만 서비스를 다시 시작해도 살아남지 못한다는 것을 알고 있습니다. 이러한 조정을 포함하도록 패키지에서 init / upstart 스크립트를 편집해야합니까? 패키지에 속한 파일을 조정할 때 매우 우아한 해결책이라고 생각하지 않습니다. 일반적으로 upstart / init 스크립트에 연결하여 조건부로 조정할 수 있습니까? 아니면 while true{ adjust_oom(); sleep 60;}
? 와 같은 무기한 스크립트를 실행하는 것이 좋습니다 .
답변
몇몇 현대식 디몬 감독 시스템에는이를위한 수단이 있습니다. (작업의 연쇄 로딩 도구가 있기 때문에 실제로, 틀림없이 그들은 모두 이 작업을 수행하는 수단을 가지고있다.)
- 시작 :
oom score
작업 파일에서 사용하십시오 .oom 점수 -500
- systemd :
OOMScoreAdjust=
서비스 유닛 의 설정을 사용하십시오 . 서비스 단위 패치 파일을 사용하여 사전 패키지 된 서비스 단위에 영향을 줄 수 있습니다.[서비스]
OOMScoreAdjust = -500 - daemontools family : 서비스를 위해 프로그램
oom-kill-protect
의 nosh 도구 세트에있는 도구를사용하십시오run
.시스템 서비스 단위를 변환하는 경우
convert-systemd-units
도구는 실제로OOMScoreAdjust=
설정을 이러한 호출로 변환합니다oom-kill-protect
.#! / bin / nosh
…
oom-kill-protect--500
…
프로그램 인수보너스로 매개 변수를 지정할 수 있습니다.
oom-kill-protect-Fromenv
서비스 환경에서 매개 변수 값을 설정하십시오 (여기서 nosh 툴셋의
rcctl
shim으로 조작 된 서비스와 관련된 envdir에서 읽은 것으로 추정 됨 ).rcctl 세트 서비스 이름 oomprotect -500
추가 자료
- 조나단 데 보이네 폴라드 (2016).
oom-kill-protect
. nosh 툴셋. 소프트웨어. - 제임스 헌트와 클린트 바이럼 (2014). ”
oom score
“. 시작 요리 책 . - Lennart Poettering (2013-10-07). ”
OOMScoreAdjust
“.systemd.exec
. 체계적인 매뉴얼 페이지. freedesktop.org. - 조나단 데 보인 폴라드.
rcctl
. nosh 툴셋. 소프트웨어. - /unix//a/409454/5132
답변
이것은 Ustarttu에서 Upstart 및 oom score
구성 옵션을 사용하여 가능합니다 .
리눅스에는 “메모리 부족”킬러 기능이 있습니다. […]
일반적으로 OOM 킬러는 모든 프로세스를 동일하게 고려하므로이 스탠자는 커널이이 작업을 다르게 처리하도록 권장합니다.
이 스탠자에 제공되는 “조정”값은 -999 (매우 OOM 킬러에 의해 강제 종료되지 않음)에서 최대 1000 (매우 OOM 킬러에 의해 강제 종료 될 수 있음)의 정수 값일 수 있습니다. […]
예:
# this application is a "resource hog" oom score 1000 expect daemon respawn exec /usr/bin/leaky-app
답변
MySQL 자체에 해킹 할 수 있지만 (예 : OpenSSH sshd
는이 작업을 수행합니다), 너무 하드 코어이며 매우 더럽습니다 (업데이트 등의 문제)
래퍼 또는 init 스크립트 에서이 작업을 수행 할 수 있습니다-점수는 상속되어야합니다 (래퍼에서 exec mysqld "$@"
어쨌든 하고 싶을 것 입니다).
사용 cgroups
-서비스 유연성을 높이고 서비스를 다시 시작할 때 적절한 설정을 자동으로 적용 할 수 있도록 영구적으로 만들 수 있습니다. 자세한 정보는 cgroup 을 사용하여 애플리케이션 우선 순위 제어를 참조하십시오 . 찾고있는 자동 기능을 얻으려면 libcgroup을 살펴보십시오 .libcgroup 에는 규칙 세트에 따라 실행중인 프로세스의 변경 cgroup을 즉시 처리하거나 cgexec
래퍼를 사용하는 데몬이 포함되어 있습니다 ( 같은 패키지에서).