웹사이트 검색

시스템 사용량, 중단을 모니터링하고 Linux 서버 문제를 해결하는 방법 - 9부


Linux는 매우 안정적이지만 현명한 시스템 관리자는 시스템의 동작과 활용도를 항상 감시할 수 있는 방법을 찾아야 합니다. 100%에 가까운 가동 시간과 리소스 가용성을 보장하는 것은 많은 환경에서 매우 중요한 요구 사항입니다. 시스템의 과거와 현재 상태를 조사하면 발생할 수 있는 문제를 예측하고 예방할 수 있습니다.

Linux Foundation 인증 프로그램 소개

이 기사에서는 시스템 상태를 확인하고, 중단을 분석하고, 진행 중인 문제를 해결하기 위해 대부분의 업스트림 배포에서 사용할 수 있는 몇 가지 도구 목록을 제시합니다. 구체적으로, 사용 가능한 수많은 데이터 중 CPU, 저장 공간 및 메모리 활용도, 기본 프로세스 관리, 로그 분석에 중점을 둡니다.

저장 공간 활용도

Linux에는 저장 공간 사용량을 검사하는 데 사용되는 잘 알려진 두 가지 명령인 dfdu가 있습니다.

첫 번째 항목인 df(disk free를 나타냄)는 일반적으로 파일 시스템의 전체 디스크 공간 사용량을 보고하는 데 사용됩니다.

예 1: 디스크 공간 사용량을 바이트 및 사람이 읽을 수 있는 형식으로 보고

옵션이 없으면 df는 디스크 공간 사용량을 바이트 단위로 보고합니다. -h 플래그를 사용하면 대신 MB 또는 GB를 사용하여 동일한 정보를 표시합니다. 이 보고서에는 각 파일 시스템의 전체 크기(1-K 블록 단위), 여유 공간 및 사용 가능한 공간, 각 저장 장치의 마운트 지점도 포함됩니다.

df
df -h

확실히 좋은 일입니다. 하지만 파일 시스템을 사용할 수 없게 만들 수 있는 또 다른 제한 사항이 있는데, 이는 inode가 부족하다는 것입니다. 파일 시스템의 모든 파일은 해당 메타데이터가 포함된 inode에 매핑됩니다.

예제 2: 사람이 읽을 수 있는 형식의 파일 시스템에서 inode 사용량 검사
df -hTi

사용된 inode와 사용 가능한 inode의 양을 확인할 수 있습니다.

위 이미지에 따르면 /home에는 146개의 사용된 inode(1%)가 있습니다. 이는 해당 파일 시스템에서 여전히 226K 파일을 생성할 수 있음을 의미합니다.

예시 3: 빈 파일 및 디렉터리 찾기 및/또는 삭제

inode가 부족해지기 오래 전에 저장 공간이 부족할 수 있으며 그 반대의 경우도 마찬가지입니다. 그렇기 때문에 저장 공간 활용도뿐만 아니라 파일 시스템에서 사용하는 inode 개수도 모니터링해야 합니다.

이유 없이 inode를 사용하고 있는 빈 파일이나 디렉터리(0B를 차지함)를 찾으려면 다음 명령을 사용하십시오.

find  /home -type f -empty
find  /home -type d -empty

또한 빈 파일과 디렉터리도 삭제하려면 각 명령 끝에 -delete 플래그를 추가할 수 있습니다.

find  /home -type f -empty --delete
find  /home -type f -empty

이전 절차에서는 4개의 파일을 삭제했습니다. /home에서 사용된/사용 가능한 노드 수를 다시 확인해 보겠습니다.

df -hTi | grep home

보시다시피 현재 142개의 inode가 사용됩니다(이전보다 4개 적음).

예제 4: 디렉터리별 디스크 사용량 조사

특정 파일 시스템의 사용이 미리 정의된 비율을 초과하는 경우 du(디스크 사용량의 약어)를 사용하여 가장 많은 공간을 차지하는 파일이 무엇인지 알아낼 수 있습니다.

위의 첫 번째 이미지에서 볼 수 있듯이 /var에 대한 예가 제공되며 67%로 사용됩니다.

du -sch /var/*

참고: 위의 하위 디렉토리로 전환하여 해당 디렉토리에 무엇이 있는지, 각 항목이 차지하는 양을 정확히 확인할 수 있습니다. 그런 다음 해당 정보를 사용하여 필요하지 않은 경우 일부 파일을 삭제하거나 필요한 경우 논리 볼륨의 크기를 확장할 수 있습니다.

또한 읽어보세요

  1. 디스크 공간을 확인하는 데 유용한 12가지 “df” 명령
  2. 파일 및 디렉터리의 디스크 사용량을 찾는 데 유용한 10가지 "du" 명령

메모리 및 CPU 활용도

CPU/메모리 사용률 및 프로세스 관리를 전반적으로 확인하는 데 사용되는 Linux의 고전적인 도구는 top 명령입니다. 또한 top은 실행 중인 시스템의 실시간 보기를 표시합니다. htop과 같이 동일한 목적으로 사용할 수 있는 다른 도구도 있지만 모든 Linux 배포판에서 기본적으로 설치되므로 top을 선택했습니다.

예 5: top으로 시스템의 실시간 상태 표시

처음부터 시작하려면 명령줄에 다음 명령을 입력하고 Enter 키를 누르세요.

top

일반적인 최고 출력을 살펴보겠습니다.

1~5행에는 다음 정보가 표시됩니다.

1. 현재 시간(오후 8:41:32) 및 가동 시간(7시간 41분). 한 명의 사용자만 시스템에 로그온했으며 각각 최근 1분, 5분, 15분 동안의 부하 평균을 나타냅니다. 0.00, 0.01, 0.05는 해당 시간 간격 동안 시스템이 해당 시간의 0% 동안 유휴 상태였다는 것을 나타냅니다(0.00: CPU를 기다리는 프로세스가 없음). 그런 다음 1%(0.01: 평균 0.01개의 프로세스)로 과부하가 발생했습니다. CPU를 기다리고 있음) 및 5%(0.05). 0보다 작고 숫자가 작을 경우(예: 0.65) 0.65가 나타나는 위치에 따라 시스템이 마지막 1분, 5분 또는 15분 동안 35% 동안 유휴 상태였습니다.

2. 현재 121개의 프로세스가 실행 중입니다(6에서 전체 목록을 볼 수 있음). 그 중 1개만 실행 중이고(이 경우 상단, %CPU 열에서 볼 수 있음) 나머지 120개는 백그라운드에서 기다리고 있지만 "잠자기" 상태이며 호출할 때까지 해당 상태를 유지합니다. 어떻게? mysql 프롬프트를 열고 몇 가지 쿼리를 실행하여 이를 확인할 수 있습니다. 실행 중인 프로세스 수가 어떻게 증가하는지 확인할 수 있습니다.

또는 웹 브라우저를 열고 Apache에서 제공하는 특정 페이지로 이동하면 동일한 결과를 얻을 수 있습니다. 물론 이 예에서는 두 서비스가 모두 서버에 설치되어 있다고 가정합니다.

3. us(수정되지 않은 우선순위로 사용자 프로세스를 실행하는 시간), sy(커널 프로세스를 실행하는 시간), ni(수정된 우선순위로 사용자 프로세스를 실행하는 시간), wa(I/O 완료를 기다리는 시간), hi(하드웨어 인터럽트 서비스에 소요된 시간), si(소프트웨어 인터럽트 서비스에 소요된 시간), st(하이퍼바이저가 현재 vm에서 훔친 시간 – 가상화된 환경에서만).

4. 물리적 메모리 사용량.

5. 스왑 공간 사용량.

예시 6: 물리적 메모리 사용량 검사

RAM 메모리와 스왑 사용량을 검사하려면 free 명령을 사용할 수도 있습니다.

free

물론 -m(MB) 또는 -g(GB) 스위치를 사용하여 동일한 정보를 사람이 읽을 수 있는 형식으로 표시할 수도 있습니다.

free -m

어느 쪽이든 커널은 가능한 한 많은 메모리를 예약하고 프로세스가 요청할 때 이를 사용할 수 있도록 한다는 사실을 알아야 합니다. 특히, "-/+ buffers/cache" 줄은 이 I/O 캐시를 고려한 후의 실제 값을 보여줍니다.

즉, 프로세스에서 사용하는 메모리 양과 다른 프로세스에서 사용할 수 있는 메모리 양입니다(이 경우 각각 232MB 사용 및 270MB 사용 가능). 프로세스에 이 메모리가 필요할 때 커널은 자동으로 I/O 캐시의 크기를 줄입니다.

또한 읽어 보세요: Linux 메모리 사용량을 확인하는 데 유용한 10가지 "무료" 명령

프로세스 자세히 살펴보기

특정 시간에 Linux 시스템에서는 많은 프로세스가 실행되고 있습니다. 프로세스를 면밀히 모니터링하는 데 사용할 두 가지 도구는 pspstree입니다.

예 7: ps(전체 표준 형식)를 사용하여 시스템의 전체 프로세스 목록 표시

-e-f 옵션을 하나로 결합하여(-ef) 사용하면 현재 시스템에서 실행 중인 모든 프로세스를 나열할 수 있습니다. 이 출력을 grep(LFCS 시리즈의 1부에서 설명)과 같은 다른 도구로 파이프하여 원하는 프로세스로 출력 범위를 좁힐 수 있습니다.

ps -ef | grep -i squid | grep -v grep

위의 프로세스 목록에는 다음 정보가 표시됩니다.

프로세스 소유자, PID, 상위 PID(상위 프로세스), 프로세서 사용률, 명령이 시작된 시간, tty(?는 데몬임을 나타냄), 누적된 CPU 시간 및 프로세스와 관련된 명령입니다.

예제 8: ps 출력 사용자 정의 및 정렬

그러나 해당 정보가 모두 필요하지 않고 프로세스 소유자, 프로세스를 시작한 명령, PID 및 PPID, 현재 사용 중인 메모리 비율을 순서대로 표시하고 싶을 수도 있습니다. 내림차순으로 메모리를 사용합니다(기본적으로 ps는 PID를 기준으로 정렬됩니다).

ps -eo user,comm,pid,ppid,%mem --sort -%mem

%mem 앞의 빼기 기호는 내림차순으로 정렬됨을 나타냅니다.

어떤 이유로 프로세스가 너무 많은 시스템 리소스를 사용하기 시작하고 시스템의 전체 기능을 위태롭게 할 가능성이 있는 경우 kill 프로그램을 사용하여 다음 신호 중 하나를 전달하여 실행을 중지하거나 일시 중지해야 합니다. 이 작업을 고려하는 또 다른 이유는 포그라운드에서 프로세스를 시작했지만 프로세스를 일시 중지하고 백그라운드에서 다시 시작하려는 경우입니다.

Signal name Signal number Description
 SIGTERM 15  Kill the process gracefully.
 SIGINT 2  This is the signal that is sent when we press Ctrl + C. It aims to interrupt the process, but the process may ignore it.
 SIGKILL 9  This signal also interrupts the process but it does so unconditionally (use with care!) since a process cannot ignore it.
 SIGHUP 1  Short for “Hang UP”, this signals instructs daemons to reread its configuration file without actually stopping the process.
 SIGTSTP 20  Pause execution and wait ready to continue. This is the signal that is sent when we type the Ctrl + Z key combination.
 SIGSTOP 19  The process is paused and doesn’t get any more attention from the CPU cycles until it is restarted.
 SIGCONT 18  This signal tells the process to resume execution after having received either SIGTSTP or SIGSTOP. This is the signal that is sent by the shell when we use the fg or bg commands.
예시 9: 실행 중인 프로세스의 실행을 일시 중지하고 백그라운드에서 다시 시작

특정 프로세스의 정상적인 실행이 실행되는 동안 화면에 출력이 전송되지 않음을 암시하는 경우 백그라운드에서 시작하거나 명령 끝에 앰퍼샌드를 추가할 수 있습니다.

process_name &

또는
전경에서 실행이 시작되면 일시 중지하고 다음을 사용하여 배경으로 보냅니다.

Ctrl + Z
kill -18 PID

예 10: "gone wild" 프로세스를 강제로 종료

각 배포판은 SysV 기반 시스템의 service 또는 systemd 기반 시스템의 systemctl과 같은 일반적인 서비스를 정상적으로 중지/시작/다시 시작/다시 로드하는 도구를 제공합니다.

프로세스가 해당 유틸리티에 응답하지 않으면 SIGKILL 신호를 보내 강제로 프로세스를 종료할 수 있습니다.

ps -ef | grep apache
kill -9 3821

그래서.. 무슨 일이 일어났나요?/무슨 일이 일어나고 있나요?

시스템에 어떤 종류의 중단이 발생한 경우(정전, 하드웨어 오류, 계획된 또는 계획되지 않은 프로세스 중단, 모든 이상 등) /var/log 무슨 일이 일어났는지 또는 현재 직면한 문제의 원인이 무엇인지 파악하는 가장 친한 친구입니다.

cd /var/log

/var/log에 있는 항목 중 일부는 일반 텍스트 파일이고, 다른 항목은 디렉터리이며, 다른 항목은 회전된(기록) 로그의 압축 파일입니다. 이름에 error라는 단어가 포함된 항목을 확인하고 싶지만 나머지 항목도 검사하는 것이 도움이 될 수 있습니다.

예시 11: 프로세스 오류에 대한 로그 검사

이 시나리오를 상상해보세요. LAN 클라이언트가 네트워크 프린터로 인쇄할 수 없습니다. 이 상황을 해결하는 첫 번째 단계는 /var/log/cups 디렉토리로 가서 거기에 무엇이 있는지 확인하는 것입니다.

tail 명령을 사용하여 error_log 파일의 마지막 10줄을 표시하거나 tail -f error_log를 사용하여 로그를 실시간으로 볼 수 있습니다.

cd /var/log/cups
ls
tail error_log

위 스크린샷은 문제의 원인을 이해하는 데 도움이 되는 정보를 제공합니다. 단계를 따르거나 프로세스의 오작동을 수정하는 것은 여전히 전체 문제를 해결하지 못할 수도 있지만, 처음부터 문제가 발생할 때마다(로컬이든 네트워크이든) 로그를 확인하는 데 익숙해지면 분명 올바른 길로 갈 거예요.

예제 12: 하드웨어 오류에 대한 로그 검사

하드웨어 오류는 문제 해결이 까다로울 수 있지만 dmesg 및 메시지 로그를 확인하고 결함이 있는 것으로 추정되는 하드웨어 부품과 관련된 단어를 grep해야 합니다.

아래 이미지는 다음 명령을 사용하여 error라는 단어를 찾은 후 /var/log/messages에서 가져온 것입니다.

less /var/log/messages | grep -i error

두 개의 저장 장치인 /dev/sdb/dev/sdc에 문제가 있어 RAID 어레이에 문제가 발생하고 있음을 알 수 있습니다.

결론

이 문서에서는 시스템의 전반적인 상태를 항상 파악하는 데 도움이 되는 몇 가지 도구를 살펴보았습니다. 또한 운영 체제와 설치된 패키지가 최신 안정 버전으로 업데이트되었는지 확인해야 합니다. 그리고 절대로 로그를 확인하는 것을 잊지 마세요! 그러면 당신은 어떤 문제에 대한 확실한 해결책을 찾을 수 있는 올바른 방향으로 나아갈 것입니다.

의견, 제안, 질문이 있는 경우 아래 양식을 사용하여 자유롭게 남겨주세요.