웹사이트 검색

LFCS: Linux 프로세스 리소스 사용량 모니터링 및 사용자별 프로세스 제한 설정 - 14부


2016년 2월 2일부터 유효한 LFCS 인증 시험 목표의 최근 수정으로 인해 여기에 게시된 LFCS 시리즈에 필요한 기사를 추가하게 되었습니다. 이 시험을 준비하려면 LFCE 시리즈도 수강하는 것이 좋습니다.

모든 Linux 시스템 관리자는 하드웨어, 리소스 및 주요 프로세스의 무결성과 가용성을 확인하는 방법을 알아야 합니다. 또한 사용자별로 리소스 제한을 설정하는 것도 해당 사용자의 기술 세트에 포함되어야 합니다.

이 기사에서는 예상치 못한 생산 중단 시간과 비용 손실을 초래할 수 있는 잠재적인 문제를 방지하기 위해 하드웨어와 소프트웨어 모두 시스템이 올바르게 작동하는지 확인하는 몇 가지 방법을 살펴보겠습니다.

Linux 보고 프로세서 통계

mpstat을 사용하면 각 프로세서의 활동을 개별적으로 또는 시스템 전체를 일회성 스냅샷 또는 동적으로 볼 수 있습니다.

이 도구를 사용하려면 sysstat를 설치해야 합니다.

yum update && yum install sysstat              [On CentOS based systems]
aptitutde update && aptitude install sysstat   [On Ubuntu based systems]
zypper update && zypper install sysstat        [On openSUSE systems]

sysstat 및 유틸리티에 대해 자세히 알아보기 Sysstat 및 해당 유틸리티 알아보기 Linux의 mpstat, pidstat, iostat 및 sar

mpstat을 설치한 후 이를 사용하여 프로세서 통계 보고서를 생성합니다.

모든 CPU(-P ALL로 표시됨)에 대한 CPU 사용률(-u)에 대한 3 전역 보고서를 2초 간격으로 표시하려면 , 하다:

mpstat -P ALL -u 2 3
샘플 출력
Linux 3.19.0-32-generic (linux-console.net) 	Wednesday 30 March 2016 	_x86_64_	(4 CPU)

11:41:07  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:09  IST  all    5.85    0.00    1.12    0.12    0.00    0.00    0.00    0.00    0.00   92.91
11:41:09  IST    0    4.48    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   94.53
11:41:09  IST    1    2.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:09  IST    2    6.44    0.00    0.99    0.00    0.00    0.00    0.00    0.00    0.00   92.57
11:41:09  IST    3   10.45    0.00    1.99    0.00    0.00    0.00    0.00    0.00    0.00   87.56

11:41:09  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:11  IST  all   11.60    0.12    1.12    0.50    0.00    0.00    0.00    0.00    0.00   86.66
11:41:11  IST    0   10.50    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   88.50
11:41:11  IST    1   14.36    0.00    1.49    2.48    0.00    0.00    0.00    0.00    0.00   81.68
11:41:11  IST    2    2.00    0.50    1.00    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:41:11  IST    3   19.40    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   79.60

11:41:11  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:13  IST  all    5.69    0.00    1.24    0.00    0.00    0.00    0.00    0.00    0.00   93.07
11:41:13  IST    0    2.97    0.00    1.49    0.00    0.00    0.00    0.00    0.00    0.00   95.54
11:41:13  IST    1   10.78    0.00    1.47    0.00    0.00    0.00    0.00    0.00    0.00   87.75
11:41:13  IST    2    2.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:13  IST    3    6.93    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   92.57

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    7.71    0.04    1.16    0.21    0.00    0.00    0.00    0.00    0.00   90.89
Average:       0    5.97    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   92.87
Average:       1    9.24    0.00    1.16    0.83    0.00    0.00    0.00    0.00    0.00   88.78
Average:       2    3.49    0.17    1.00    0.00    0.00    0.00    0.00    0.00    0.00   95.35
Average:       3   12.25    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   86.59

특정 CPU(다음 예에서는 CPU 0)에 대한 동일한 통계를 보려면 다음을 사용하세요.

mpstat -P 0 -u 2 3
샘플 출력
Linux 3.19.0-32-generic (linux-console.net) 	Wednesday 30 March 2016 	_x86_64_	(4 CPU)

11:42:08  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:42:10  IST    0    3.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:42:12  IST    0    4.08    0.00    0.00    2.55    0.00    0.00    0.00    0.00    0.00   93.37
11:42:14  IST    0    9.74    0.00    0.51    0.00    0.00    0.00    0.00    0.00    0.00   89.74
Average:       0    5.58    0.00    0.34    0.85    0.00    0.00    0.00    0.00    0.00   93.23

위 명령의 출력에는 다음 열이 표시됩니다.

  1. CPU: 프로세서 번호(정수) 또는 all이라는 단어는 모든 프로세서의 평균입니다.
  2. %usr: 사용자 수준 애플리케이션을 실행하는 동안 CPU 사용률입니다.
  3. %nice: %usr와 동일하지만 우선순위가 nice입니다.
  4. %sys: 커널 응용 프로그램을 실행하는 동안 발생한 CPU 사용률입니다. 여기에는 인터럽트를 처리하거나 하드웨어를 처리하는 데 소요된 시간은 포함되지 않습니다.
  5. %iowait: 해당 CPU(또는 전체)가 유휴 상태였으며, 그 동안 해당 CPU에 리소스 집약적인 I/O 작업이 예정되어 있었던 시간의 비율입니다. 더 자세한 설명(예제 포함)은 여기에서 확인할 수 있습니다.
  6. %irq: 하드웨어 인터럽트를 처리하는 데 소요된 시간의 백분율입니다.
  7. %soft: %irq와 동일하지만 소프트웨어 인터럽트가 있습니다.
  8. %steal: 게스트인 가상 머신이 CPU를 놓고 경쟁하는 동안 하이퍼바이저의 주의를 "승리"할 때 비자발적인 대기(도용 또는 도난 시간)에 소요된 시간의 백분율입니다. 이 값은 가능한 한 작게 유지되어야 합니다. 이 필드의 값이 높으면 가상 머신이 정지되고 있거나 곧 정지될 것임을 의미합니다.
  9. %guest: 가상 프로세서를 실행하는 데 소요된 시간의 백분율입니다.
  10. %idle: CPU가 작업을 실행하지 않은 시간의 비율입니다. 이 열에서 낮은 값이 관찰되면 이는 시스템에 과부하가 걸렸음을 나타냅니다. 이 경우 프로세스 목록을 자세히 살펴보고 원인이 무엇인지 확인해야 합니다.

프로세서에 다소 높은 로드를 적용하려면 다음 명령을 실행한 후 별도의 터미널에서 mpstat(표시된 대로)를 실행하십시오.

dd if=/dev/zero of=test.iso bs=1G count=1
mpstat -u -P 0 2 3
ping -f localhost # Interrupt with Ctrl + C after mpstat below completes
mpstat -u -P 0 2 3

마지막으로 "정상적인" 상황에서 mpstat의 출력을 비교해 보세요.

위 이미지에서 볼 수 있듯이 %idle 열에 표시된 것처럼 처음 두 예시에서 CPU 0에 과부하가 걸렸습니다.

다음 섹션에서는 리소스를 많이 사용하는 프로세스를 식별하는 방법, 이에 대한 추가 정보를 얻는 방법, 적절한 조치를 취하는 방법에 대해 설명합니다.

Linux 프로세스 보고

CPU 사용량을 기준으로 정렬하여 프로세스를 나열하려면 잘 알려진 ps 명령을 -eo(사용자 정의 형식으로 모든 프로세스 선택) 및 와 함께 사용합니다. --sort (사용자 정의 정렬 순서 지정) 옵션은 다음과 같습니다:

ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu

위 명령은 PID, PPID, 프로세스와 관련된 명령, 그리고 CPU 사용량 비율에 따라 내림차순으로 정렬된 CPU 및 RAM 사용량 비율만 표시합니다. . .iso 파일을 생성하는 동안 실행될 경우 출력의 처음 몇 줄은 다음과 같습니다.

관심 있는 프로세스(예: PID=2822인 프로세스)를 식별하면 /proc/PID(/proc/2822 )로 이동할 수 있습니다. 이 경우 ) 디렉토리 목록을 작성합니다.

이 디렉토리는 이 특정 프로세스에 대한 자세한 정보가 포함된 여러 파일과 하위 디렉토리가 실행되는 동안 보관되는 곳입니다.

예를 들어:
  1. /proc/2822/io에는 프로세스에 대한 IO 통계(IO 작업 중에 읽고 쓴 문자 및 바이트 수)가 포함되어 있습니다.
  2. /proc/2822/attr/current는 프로세스의 현재 SELinux 보안 속성을 보여줍니다.
  3. /proc/2822/cgroup은 CONFIG_CGROUPS 커널 구성 옵션이 활성화된 경우 프로세스가 속하는 제어 그룹(줄여서 cgroup)을 설명합니다. 이는 다음을 통해 확인할 수 있습니다.
cat /boot/config-$(uname -r) | grep -i cgroups

옵션이 활성화된 경우 다음이 표시됩니다.

CONFIG_CGROUPS=y

cgroups를 사용하면 Red Hat Enterprise Linux 7 리소스 관리 가이드의 1~4장, openSUSE 시스템 분석의 9장에 설명된 대로 프로세스별로 허용되는 리소스 사용량을 관리할 수 있습니다. 및 튜닝 가이드 및 Ubuntu 14.04 서버 설명서의 제어 그룹 섹션에 있습니다.

/proc/2822/fd는 프로세스가 연 각 파일 설명자에 대한 하나의 기호 링크를 포함하는 디렉토리입니다. 다음 이미지는 .iso 이미지를 생성하기 위해 tty1(첫 번째 터미널)에서 시작된 프로세스에 대한 정보를 보여줍니다.

위 이미지는 stdin(파일 설명자 0), stdout(파일 설명자 1) 및 을 보여줍니다. >stderr(파일 설명자 2)은 /dev/zero, /root/test.iso에 매핑됩니다. >/dev/tty1입니다.

/proc에 대한 자세한 내용은 Kernel.org에서 보관하고 관리하는 "/proc 파일 시스템" 문서와 Linux 프로그래머 매뉴얼에서 찾을 수 있습니다.

Linux에서 사용자별 리소스 제한 설정

주의하지 않고 모든 사용자가 무제한의 프로세스를 실행하도록 허용하면 결국 예기치 않은 시스템 종료가 발생하거나 시스템이 사용할 수 없는 상태가 되어 잠길 수 있습니다. 이런 일이 발생하지 않도록 하려면 사용자가 시작할 수 있는 프로세스 수를 제한해야 합니다.

이렇게 하려면 /etc/security/limits.conf를 편집하고 파일 하단에 다음 줄을 추가하여 제한을 설정하세요.

*   	hard	nproc   10

첫 번째 필드는 사용자, 그룹 또는 이들 모두 (*)를 나타내는 데 사용할 수 있는 반면, 두 번째 필드는 프로세스 수(nproc)를 로 엄격하게 제한합니다. 10. 변경 사항을 적용하려면 로그아웃했다가 다시 로그인하면 됩니다.

따라서 루트가 아닌 특정 사용자(합법적인 사용자이든 아니든)가 쉘 포크 폭탄을 시작하려고 시도하면 어떤 일이 발생하는지 살펴보겠습니다. 제한을 구현하지 않았다면 처음에 두 개의 함수 인스턴스를 시작한 다음 끝없는 루프에서 각 인스턴스를 복제합니다. 따라서 결국 시스템이 크롤링 상태가 됩니다.

그러나 위의 제한 사항을 적용하면 포크 폭탄은 성공하지 못하지만 시스템 관리자가 이와 관련된 프로세스를 종료할 때까지 사용자는 계속 잠깁니다.

팁: ulimit로 가능한 기타 제한 사항은 limits.conf 파일에 문서화되어 있습니다.

Linux 기타 프로세스 관리 도구

이전에 설명한 도구 외에도 시스템 관리자는 다음을 수행해야 할 수도 있습니다.

a) renice를 사용하여 프로세스의 실행 우선순위(시스템 리소스 사용)를 수정합니다. 이는 커널이 할당된 우선순위(-20부터 19).

값이 낮을수록 실행 우선순위가 높아집니다. 일반 사용자(루트 제외)는 자신이 소유한 프로세스의 niceness를 더 높은 값(낮은 실행 우선순위를 의미)으로만 수정할 수 있는 반면, 루트는 모든 프로세스에 대해 이 값을 수정하고 늘리거나 줄일 수 있습니다.

renice의 기본 구문은 다음과 같습니다.

renice [-n] <new priority> <UID, GID, PGID, or empty> identifier

새 우선순위 값 뒤의 인수가 존재하지 않는 경우(비어 있는 경우) 기본적으로 PID로 설정됩니다. 이 경우 PID=identifier를 사용한 프로세스의 적합성은 로 설정됩니다.

b) 필요한 경우 프로세스의 정상적인 실행을 중단합니다. 이는 일반적으로 프로세스를 "종료"하는 것으로 알려져 있습니다. 내부적으로 이는 실행을 적절하게 완료하고 사용된 리소스를 순서대로 해제하기 위해 프로세스에 신호를 보내는 것을 의미합니다.

프로세스를 종료하려면 다음과 같이 kill 명령을 사용하세요.

kill PID

또는 pkill을 사용하여 특정 소유자 (-u), 그룹 소유자 (-G)의 모든 프로세스 또는 PPID가 있는 프로세스까지 종료할 수 있습니다. 공통 (-P)입니다. 이러한 옵션 뒤에는 숫자 표현이나 실제 이름이 식별자로 올 수 있습니다.

pkill [options] identifier

예를 들어,

pkill -G 1000

GID=1000인 그룹이 소유한 모든 프로세스를 종료합니다.

그리고,

pkill -P 4993 

PPID가 4993인 모든 프로세스를 종료합니다.

pkill을 실행하기 전에 먼저 pgrep으로 결과를 테스트하는 것이 좋습니다. 아마도 -l 옵션도 사용하여 프로세스의 이름. 동일한 옵션을 사용하지만 pkill이 사용되는 경우 종료될 프로세스의 PID만 반환합니다(추가 조치를 취하지 않음).

pgrep -l -u gacanepa

이는 다음 이미지에 설명되어 있습니다.

요약

이 기사에서는 Linux 시스템의 중요한 하드웨어 및 소프트웨어 구성 요소의 무결성과 가용성을 확인하기 위해 리소스 사용량을 모니터링하는 몇 가지 방법을 살펴보았습니다.

또한 비정상적인 상황에서 적절한 조치(주어진 프로세스의 실행 우선순위를 조정하거나 종료하여)를 취하는 방법도 배웠습니다.

이 튜토리얼에서 설명하는 개념이 도움이 되었기를 바랍니다. 질문이나 의견이 있는 경우 아래 문의 양식을 사용하여 언제든지 문의해 주세요.