[Linux] 재 시작 해야 하는데 shutdown이 안된다...
안녕하세요 ki입니다.
이번 Exp는 최근에 업무 중 경험한 shutdown 오류입니다.
업무 중에 부득이하게 서버를 재기동해야 하는 상황에서였습니다.
shutdown 후 startup을 하려던 찰나...
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000a0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /home/.../tomcat7/bin/hs_err_pid10033.log
The stop command failed. Attempting to signal the process to stop through OS signal.
Tomcat did not stop in time.
PID file was not removed.
To aid diagnostics a thread dump has been written to standard out.
유지보수 업무를 얼마 전에 시작한 저로써는 정말 정말 당황스러웠습니다...
다행히 서비스는 다운되지 않았습니다....(셧다운이 안 됐으니 당연한 얘기겠죠...?)
해결하기
해결을 위해 구글링 하여 캐시 삭제 명령어를 발견했습니다.
# root 계정으로 변경
sudo -s
# 메모리 확인
free -m
# 메모리에서 버퍼/캐시 삭제
sync && echo 3 > /proc/sys/vm/drop_caches
# sync
# 디스크 쓰기 버퍼에 있는 데이터를 실제 디스크에 기록
# 이 명령어를 통해 데이터를 잃지 않고 안전하게 캐시를 지울수 있음
# echo 3 > /proc/sys/vm/drop_caches
# 이 명령어부터 캐시를 삭제함
# 3을 /proc/sys/vm/drop_caches에 기록한다는 의미
# echo 1(페이지 캐시만 삭제)
# / 2 (디렉토리 엔트리와 inode캐시만 삭제)
# / 3 (페이지 캐시, 디렉토리 엔트리, inode 캐시를 모두 삭제)이 존재
# 주의사항
# * 데이티 접근 속도가 느려질수 있음
# * 관리자 권한 필요
# * 리눅스 커널은 캐시를 자동으로 정리하여 효율적으로 관리하는데
# 수동으로 정리하는 경우는 디벙깅이나 테스트 같은 특수 상황에서 사용
기대감을 안고 다시 셧다운을 진행하였습니다.
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000a0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /home/.../tomcat7/bin/hs_err_pid10033.log
The stop command failed. Attempting to signal the process to stop through OS signal.
Tomcat did not stop in time.
PID file was not removed.
To aid diagnostics a thread dump has been written to standard out.
결국 캐시 삭제로는 해결을 못하게 됐...쓰....빈나...ㅜ
다른 방법을 찾기로 했습니다...
이후에 회사 차장님한테 질문을 드렸는데 해당 시스템이 이상하게 프로세스가 죽지도 않고 쌓인다고 하셨고
기존 방법을 공유받았습니다.
해결하기 2
기존 방법은 프로세스를 확인하여 종료여부를 확인하고 종료가 되지 않았다면 수동으로 종료를 해주는 방식으로 진행했다고 했습니다.
ps -ef | grep tomcat
리눅스 ps 명령어 확인하여 프로세스를 확인합니다.
ps명령어는 현재 실행 중인 프로세스들을 확인할 때 사용하는 명령어입니다. 프로세스 상태(process status)의 의미하며
프로세스의 ID(PID), 사용자, CPU 사용량, 메모리 사용량, 실행 시간 등의 정보를 제공합니다.
# ps 명령어 옵션
ps
# 모든 프로세스 보기
# -e
ps e
# 포멧지정
# -f ex : ps ef 방싱으로 도 사용가능 / ps -ef --forest
ps f
# 특정 사용자 프로세스 보기
#-u
ps u username
# 지정된 프로세스 보기
#-p
ps p pid
# 긴 포멧으로 보기
#-l
ps l
# cpu 및 메모리 사용량에 따라 정렬
aux --sort=-%cpu
조회 후에는 다음 명령어로 프로세스를 종료할 수 있습니다.
# 프로세스 종료 명렁어
#
sudo kill [옵션] 종료할프로세스PID
or
kill [옵션] 종료할프로세스PID
# 옵션
SIGTERM (15): 프로세스를 정상적으로 종료, 종료 전에 정리 작업 진행 간으
SIGKILL (9): 프로세스를 강제 종료, 정리 작업을 할 수 없으며 즉시 종료
SIGHUP (1): 프로세스에 재시작을 요청, 설정 파일을 다시 읽게 할 때 사용
SIGINT (2): 터미널에서 중단 신호를 전송. Ctrl+C에 해당합니다.
SIGSTOP (19): 프로세스를 일시 정지
SIGCONT (18): 일시 정지된 프로세스를 계속 실행
# ex
kill 15 1234
kill 9 1234
ps 명령어로 검색해 보니 죽지 않은 프로세스들이 8개나 존재하였고 15번 옵션으로 종료 처리를 진행하였더니
정상적으로 셧다운이 실행됐습니다. (주의할 점은 kill명령어로 프로세스 종료 작업 중에 서비스가 종료처리가 됩니다 )
서버에 작업을 하면서 프로세스가 남는 이유가 무엇인지 정확하게 파악을 해보면 좋을 것 같아 공부를 해보려고 합니다.
감사합니다.