[unix] 데몬에 대한 OOM 킬러 조정을 영구적으로 설정하는 방법은 무엇입니까?

단일 또는 몇 가지 중요한 시스템 서비스 데몬으로 일부 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 툴셋의 rcctlshim으로 조작 된 서비스와 관련된 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 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래퍼를 사용하는 데몬이 포함되어 있습니다 ( 같은 패키지에서).


답변