우리는 컴퓨팅 목적으로만 소규모 서버(Ubuntu 14.04)를 운영합니다. 때때로 사용자는 시스템을 정지시킬 만큼 충분한 메모리를 소비합니다. 지난번에는 메모리를 많이 소비하는 하위 프로세스 30개를 생성한 프로세스가 원인이었습니다. 결과적으로 문제를 해결하기 위해 컴퓨터에 로그인할 수 없습니다. SSH와 로컬 로그인 모두 시간 초과되었습니다. OOM Killer는 아무것도 하지 않는 것 같습니다. egrep -i 'killed process' /var/log/*
아무것도 반환되지 않습니다.
이 상황에서 명령줄 액세스를 유지/얻을 수 있는 방법이 있습니까?
답변1
시스템 리소스 사용량을 제한하는 방법이 있습니다. 명령과 사용법을
확인하세요 . 어떤 그룹이 얼마나 많은 리소스를 가질 수 있는지 지정할 수 있는 ulimit
conf 파일이 있습니다 . limits.conf
예를 들어 conf 파일에 다음을 지정하는 경우:
@developers soft nproc 20
@developers hard nproc 30
그러면 developers
그룹은 30개의 프로세스만 가질 수 있으며, 20개에 도달하면 경고를 받게 됩니다. 프로세스 수를 전체적으로 제한할 수도 있습니다 ulimit -u 10
. 이 경우 사용자는 10개의 프로세스를 실행할 수 있습니다.
ulimit -a
전류 한계를 표시하는 데 사용됩니다 . 메모리를 제한하려면 를 사용해 보세요 ulimit -v
.
user@localhost:~$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 256646
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 32768
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 32768
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
답변2
Maz가 답변에서 언급했듯이 이러한 일이 발생하지 않도록 조치를 취할 수 있습니다. 하지만 상자가 어떤 상황에서든, 심지어 예상치 못한 상황에서도 복구하려면 감시자가 필요합니다.
Linux에서 Watchdog은 주기적으로 "ping"을 보내는 프로세스이며, "ping"이 수신되지 않으면 시스템이 재설정됩니다. 내가 "핑"이라고 말하는 것은 네트워크 ICMP 에코 요청이 아니라 "안녕하세요, 나 살아 있어요"라는 메시지를 의미합니다. 핑은 재설정을 수행하기 위해 호스트를 재부팅하는 것과 같은 작업을 수행할 수 있는 물리적 감시 장치로 전송될 수 있지만 Linux 커널 내에서 작동될 수도 있습니다. 하드웨어 감시 장치는 일반적으로 엔터프라이즈급 장치에서만 발견되므로 후자를 가장 원할 것입니다.
어쨌든 시작하려면 먼저 커널에서 소프트웨어 감시 기능을 활성화해야 합니다. 이것이 아마도 가장 큰 장애물일 것이다. 우분투에 감시 기능이 활성화되어 있는지 모르겠습니다. 이용 가능 여부를 확인하세요 /dev/watchdog
. 그렇지 않다면 시도해 보십시오 modprobe softdog
. 둘 다 작동하지 않고 계속 이 작업을 수행하려면 SOFT_WATCHDOG
이 옵션을 사용하여 커널을 다시 컴파일 해야 합니다 .
이제 watchdog이 활성화되었다고 가정하고 설치해야 합니다.지키는 개팩.
/etc/watchdog.d
설치가 완료되면 상태 확인을 수행하는 데 사용할 스크립트 ( test-binary
에서도 사용 가능 watchdog.conf
)를 넣고 실행 가능하게 만듭니다. SSH가 제대로 실행되는지 확인하려면 다음을 수행하세요.
#!/bin/bash
case "$1" in
test)
ssh testuser@localhost /bin/true
;;
repair)
service ssh restart
;;
*)
false
;;
esac
(위 내용을 정확하게 따르려면 공개 키 인증을 만들고 설정해야 testuser
하지만 이는 이 답변의 범위를 벗어납니다.)
test
워치독은 상태 확인을 수행하고 실패할 경우 시도하는 스크립트를 호출합니다 repair
. 수리에도 실패하면 시스템이 재설정됩니다.
보다워치독 문서더 알아보기.