“운영”이 필요한 모든게 다 그렇듯 서버도 살아 움직이는 것과 같기에 지속적으로 관리해줘야 한다. 하지만 평소에 관리보다 라이브 서버에 문제가 터졌을때 빨리 원인을 파악해서 문제를 신속정확하게 해결하는게 더 중요하다. 그러나 이 “급박한 문제해결”의 순간은 맨정신으로 있기가 힘들다. 초 단위로 항의 전화가 오고 고객과 돈이 속수무책으로 날아가는 스트레스 상황은 경력과 상관없이 모든 개발자들도 당황하게 만든다… 신입 개발자들은 거의 패닉에 빠지는걸 많이 봤다. 나 역시 종종 그렇고 예전에도 그랬었다.

폭풍이 지나간것 처럼 문제를 해결하고 나서 “뭔가 문제가 터졌을때 빨리 확인해볼수 있는 체크리스트가 있어야 한다.”라는 생각을 자주 했다. 그래서 간단하게 확인해볼 거리들을 Linux 터미널에서 시도해볼수 있는 커맨드와 함께 정리해 보았다. 수많은 서버 관리 도구가 나왔지만 어떠한 환경에서도 확실하게 동작하는건 Linux 터미널 도구였다 = 결국 직접 문제가 생긴 환경에 들어가봐야 한다.

1) CPU 상태 확인

서버 퍼포먼스 문제가 있다면 top 명령어로 CPU 사용량을 확인한다. 당신이 만든 어플리케이션이 지나치게 많은 CPU를 (50% 이상) 먹고있지 않은지 확인한다.

$ top

2) 메모리 상태 확인

당연하겠지만 메모리가 부족하면 안된다. 아래 명령어로 얼마나 메모리가 남았나 확인한다. 최소한 500메가 이상은 남아줘야 커널패닉이 나지 않는다.

$ free -m

3) 프로세스(쓰레드 상태) 확인

프로세스가 너무 많이 생겼거나 아예 프로세스가 죽어버린 경우가 있다. 본인이 띄운 프로세스가 살아 있는지 확인한다.

$ ps -ef | grep <process name>

4) 서비스/데몬 확인

데몬(daemon)은 백그라운드에서 돌아가는 프로세스를 말한다. 윈도우즈의 서비스를 생각하면 된다. 본인의 서버 프로그램이 데몬으로 돌아간다면 프로세스가 잘 돌아가고 있는지 확인한다.

$ service <daemon name> status

5) 네트워크 상태 확인

당연하지만 현재 서버의 네트워크 설정 및 상태를 보고 싶다면 아래 명령어를 쓴다.

$ ifconfig

하지만 이게 다가 아니다. 네트워크 쪽은 특별히 몇가지 케이스로 다뤄본다.

내 서버에서 접속이 가능합니까?

TCP 80, 443등의 특수 포트가 열려 있는지 확인하고자 한다면

$ nc <hostname> <port>
$ nc localhost 80
$ nc localhost 443

UDP인 경우엔 u 옵션으로 빠르게 확인해볼수 있다.

$ nc -u <hostname> <port>

<hostname>을 외부 서버로 해두면 이 서버에서 해당 host로 접속이 가능한지 확인해볼수 있다. 예를들어, 방화벽으로 막혀 있는가 등을 확인해 볼수 있다. 좀더 자세한 output을 위해선 -v 옵션을, 연결테스트 하는데 3초만 기다리고 싶다면 -w3 옵션을 주자.

누가 내 포트를 먹었는가?

개발하다보면 다른 프로세스와 port가 겹치는 에러를 접하게 된다. 이때 어떤 프로세스가 내가 port를 독차지하고 있는지 확인해볼수 있다. 예를들어 TCP 80 포트를 잡아먹고 있는 프로세스를 찾는다면

$ lsof -i TCP:80 

또는 현재 특정 프로세스가 어떤 포트를 차지하는지 알고 싶다면 (여기선 httpd 데몬)

$ lsof -c httpd

nc와 lsof 명령어는 쓸모가 매우 많으니 잘 알아두자

서버가 응답이 자꾸 늦어져요

종종 서버의 응답이 늦어질때 요청이 서버에 엄청 몰리는게 문제인지 알고 싶을때가 있다. 이때엔 네트워크 연결수로 확인해볼수 있다.

$ netstat -nap | grep ESTAB | wc

연결수가 지나치게 많다면 어디선가 자꾸 연결이 생성되고 있다고 보면된다. 요청이 외부에서 들어온다면 몰리는 것이고 아니라면 뭔가 서버에 이상이 있는 것이다.

$ netstat -nap | grep TIME_WAIT | wc

TIME_WAIT 수가 비정상적으로 많으면 들어오는 요청을 서버에서 제대로 처리를 못하고 있다고 보면된다. 한마디로 병목현상이 벌어지고 있는 것이다.

5) 디스크 상태 확인

서버는 한번 전원이 들어오면 오랜시간 방치하는 경우가 많기 때문에 디스크에 쓰레기가 쌓이는 경우가 많다. 디스크가 꽉 차버리면 시스템에서 파일을 못 만들게 되고 결국 서버가 죽는다. 디스크 볼륨별로 얼마나 차 있는지, 빈 공간이 얼마나 남았는지 알고 싶다면 다음명령어로 확인한다.

$ df -uh

root와 swap 볼륨이 충분한 여유가 있어야 한다.

6) 로깅 상태 확인

이건 번외인데 서버 초보들이 자주 범하는 실수라 적어둔다. 리눅스의 서버 로그는 /var/log 폴더 아래 저장이 되는데 여기에 본인 어플리케이션의 로그를 log rotation 시켜놓지 않는 경우가 있다.

그래서 단일 로그파일이 수 기가 바이트를 우습게 넘기는걸 종종 목격하는데 파일이 크면 클수록 프로세스가 처리하기 힘들어지고 결국 성능 저하로 연결된다. 메모리가 점점 늘어나고, 디스크 읽기 쓰기 성능이 계속 저하되는 증상을 보이지만 모니터링을 하지 않기 때문에 모르는 경우도 많고 이게 문제인지도 몰라서 고생하는걸 여러번 봤다.

log rotate를 처음 들어보고, 본인 서버 어플리케이션 성능이 계속 저하된다면 본인 서버의 로그가 어디 찍히는지 확인해보자.

※위 포스팅이 문제 있을시, 삭제처리 하겠습니다.

출처 : https://medium.com/hbsmith/linux-%EC%84%9C%EB%B2%84-%EC%9E%A5%EC%95%A0%EC%9B%90%EC%9D%B8-%ED%8C%8C%EC%95%85%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-7accec423bb5