# 시스템 부하
[root@master ~]# uptime
10:59:44 up 243 days, 21:23, 1 user, load average: 1.03, 3.11, 4.14
평균 부하(load average)의 다음에 나오는 세 개의 숫자(1.03, 3.11, 4.14)는 시스템에서의 1분, 5분, 15분 동안의 평균 부하를 각각 나타낸다.
시스템의 평균 부하는 실행 가능한 상태 혹은 중단 불가능한 상태의 프로세스들의 평균 개수와 같다.
실행 가능한 프로세스는 현재 CPU를 사용하고 있거나 CPU 사용을 위해 대기 중인 상태이고, 중단 불가능한 프로세스는 I/O를 기다리고 있는 프로세스다.
단일 CPU 환경의 시스템에서 평균 부하 1의 의미는 한 개의 CPU가 끊임없이 일을 하고 있다는 뜻이다.
# top을 이용한 부하 문제 진단
> top 출력 정보
Cpu(s): 43.7%us, 56.0%sy, 0.2%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
- us : user CPU time
nice가 적용되지 않은 사용자 프로세스가 소비한 CPU 사용량을 시간의 비율로 나타냄(nice는 다른 프로세스에 우선순위를 적용하는 것)
- sy : system CPU time
커널과 커널 프로세스의 CPU 사용량을 시간의 비율로 보여줌
- ni : nice CPU time
nice를 적용한 프로세스가 있을 경우 해당 프로세스의 CPU 사용량을 시간의 비율로 보여줌
- id : CPU idle time
이것은 CPU가 사용되지 않는 유휴 상태의 비율을 나타냄.
느려진 시스템에서 이 수치가 높게 나타난다면 시스템이 느려진 원인이 CPU 부하 때문이 아니라는 뜻.
- wa : I/O wait
CPU사 I/O를 기다리면서 소비한 시간의 비율을 나타낸 것.
이 수치는 느려진 시스템의 원인을 찾을 때 특히 중요.
이 값이 낮으면 원인을 찾을 때 디스크 혹은 네트워크 I/O를 확실하게 배제할 수 있기 때문.
- hi : hardware interrupts
하드웨어 인터럽트를 제공하는 데 CPU가 소비한 시간의 비율을 나타낸 수치.
- si : software interrupts
소프트웨어 인터럽트를 제공하는 데 CPU가 소비한 시간의 비율을 나타낸 수치.
- st : steal time
가상 머신을 실행 중일 경우 이 수치는 가상 머신을 위해 다른 task에서 사용된 CPU 사용량에 대한 시간의 비율을 나타낸 수치.
> top 프로세스 리스트에서 특정 프로세스를 종료하려면 'k' 키를 누른다.
'k'키를 누르면 15번 시그널을 보낼 수 있는 프롬프트가 나오고 여기에 PID를 입력하면 프로세스를 종료시킬 수 있다.
top Help Commands
Help for Interactive Commands - procps version 3.2.8
Window 1:Def: Cumulative mode Off. System: Delay 3.0 secs; Secure mode Off.
Z,B Global: 'Z' change color mappings; 'B' disable/enable bold
l,t,m Toggle Summaries: 'l' load avg; 't' task/cpu stats; 'm' mem info
1,I Toggle SMP view: '1' single/separate states; 'I' Irix/Solaris mode
f,o . Fields/Columns: 'f' add or remove; 'o' change display order
F or O . Select sort field
<,> . Move sort field: '<' next col left; '>' next col right
R,H . Toggle: 'R' normal/reverse sort; 'H' show threads
c,i,S . Toggle: 'c' cmd name/line; 'i' idle tasks; 'S' cumulative time
x,y . Toggle highlights: 'x' sort field; 'y' running tasks
z,b . Toggle: 'z' color/mono; 'b' bold/reverse (only if 'x' or 'y')
u . Show specific user only
n or # . Set maximum tasks displayed
k,r Manipulate tasks: 'k' kill; 'r' renice
d or s Set update interval
W Write configuration file
q Quit
( commands shown with '.' require a visible task display window )
Press 'h' or '?' for help with Windows,
any other key to continue
top을 한 번만 실행해 전체 출력 결과를 보고자 할때
[root@master ~]# top -b -n 1
top - 11:12:00 up 59 min, 4 users, load average: 0.02, 0.06, 0.15
Tasks: 212 total, 1 running, 211 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2%us, 0.1%sy, 0.0%ni, 99.6%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3914396k total, 689696k used, 3224700k free, 29992k buffers
Swap: 4046840k total, 0k used, 4046840k free, 312528k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19348 1560 1252 S 0.0 0.0 0:00.71 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:00.02 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
7 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/1
8 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/1
9 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/1
10 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/1
top 출력 정보를 파일로 저장
[root@master ~]# top -b -n 1 > top_output
top 출력 결과를 화면으로도 보고 파일로도 저장(tee 명령)
[root@master ~]# top -b -n 1 | tee top_output_tee
# 느려진 시스템 확인 사항
1) 느려진 시스템을 진단할 때 가장 먼저 확인해야 할 수치 중 하나는 I/O 대기 값이다.
이 수치를 통해 I/O를 문제의 원인에서 배제할 수도 있다.
I/O 대기가 높다면 그다음 단계는 무엇이 높은 디스크 I/O를 유발하는지 진단하는 것이다.
2) I/O 대기와 유휴 시간이 모두 낮다면 다음으로 높은 사용자 CPU 사용률을 살펴볼 것이고, 무엇이 높은 사용자 CPU 사용률을 야기하는지 확인해야 한다.
I/O 대기 시간은 낮고 유휴 시간값은 높다면 시스템이 느려진 원인은 CPU 자원 때문에 발생한 것이 아니므로 문제 해결을 다른 곳에서 시작해야 한다.
높은 입출력 대기 문제 진단
높은 I/O 대기 증상을 보았다면 가장 먼저 확인해봐야 하는 것은 시스템이 대량의 스왑을 사용하고 있는가다.
하드디스크가 RAM보다 훨씬 더 느리기 때문에 시스템에서 RAM이 고갈되고 스왑을 사용하게 되면 거의 모든 시스템은 성능 문제로 고생할 수밖에 없다.
디스크에 접근하려는 것들은 모두 디스크 I/O를 위해 스왑과 경합을 하게 된다(그래서 먼저 메모리가 모두 고갈됐는지 진단하고, 그렇다면 그 부분에서 문제를 처리하면 된다).
RAM 용량이 충분하다면 어느 프로그램에서 대부분의 I/O를 사용하고 있는지 밝혀낼 필요가 있다.
시스템이 과도한 I/O 부하에 걸려있다면 맨 먼저 진행해야 할 단계는 각 파티션을 살펴보고 어느 파티션에서 과도한 I/O 부하가 발생하는지 확인하는 것이다.
일단 과도한 I/O 부하가 발생한 곳을 알아냈다면 그다음 단계로 대부분의 I/O가 읽기인지 쓰기인지 확인할 필요가 있다.
iostat 출력 정보
[smu2]ns2:/home/oracle>iostat
Linux 2.6.18-128.el5PAE (ns2) 2013년 09월 02일
avg-cpu: %user %nice %system %iowait %steal %idle
2.78 0.00 1.62 10.63 0.00 84.96
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
hda 45.46 623.87 1793.24 2129614 6121356
hda1 0.03 0.57 0.00 1960 4
hda2 0.06 1.21 0.19 4128 656
hda3 2.05 97.11 8.80 331498 30048
hda4 0.00 0.00 0.00 8 0
hda5 1.22 1.61 13.85 5493 47264
hda6 0.13 0.99 0.95 3370 3240
hda7 0.01 0.43 0.00 1459 0
hda8 41.95 521.77 1769.45 1781114 6040144
- tps
장치에 대한 초당 전송량을 나타냄.
"전송"은 장치에 보내는 I/O 요청을 다르게 표현한 것
- Blk_read/s
장치에서 초당 읽혀지는 블럭의 수
- Blk_wrtn/s
장치에 초당 쓰여지는 블럭의 수
- Blk_read
장치에서 읽어들인 전체 블럭의 수
- Blk_wrtn
장치에 쓰여진 전체 블럭의 수
iotop 사용
iotop은 시스템에서 실행되고 있는 모든 프로세스를 I/O 통계를 기준으로 정렬해서 보여준다는 점에서 top과 iostat를 조합한 것이다.
iostat는 리눅스 커널의 일부 새로운 기능을 사용하고 있으며, 커널 2.6.20 이상을 필요로 한다.
iostat가 기본으로 설치돼 있지 않다면 iotop이라는 패키지에서 찾을 수 있을 것이다.
[root@master ~]# iotop
1462 be/4 root 0.00 B/s 35.38 K/s 0.00 % 0.00 % [flush-253:0]
Total DISK READ: 0.00 B/s | Total DISK WRITE: 7.85 K/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
3 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
4 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
5 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
6 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/0]
7 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/1]
sar 사용 통계 정보
- sar는 기본적으로 당일의 CPU 통계를 보여줌
[root@master ~]# sar | more
Linux 2.6.18-128.el5PAE (ns2) 2013년 09월 02일
` CPU %user %nice %system %iowait %steal %idle
` all 43.97 0.00 56.03 0.00 0.00 0.00
` all 43.93 0.00 56.07 0.00 0.00 0.00
` all 43.96 0.00 56.04 0.00 0.00 0.00
` all 43.92 0.13 55.94 0.00 0.00 0.00
` all 43.98 0.00 56.02 0.00 0.00 0.00
` all 43.95 0.00 56.05 0.00 0.00 0.00
RAM 통계 정보 보기
[root@master ~]# sar -r | more
Linux 2.6.18-128.el5PAE (ns2) 2013년 09월 02일
` kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
` 109488 4040944 97.36 425180 1291628 3970036 126496 3.09 160
` 109240 4041192 97.37 425180 1291940 3970036 126496 3.09 160
` 108992 4041440 97.37 425180 1292252 3970036 126496 3.09 160
` 108124 4042308 97.39 425180 1292580 3970036 126496 3.09 160
` 108000 4042432 97.40 425180 1292888 3970036 126496 3.09 160
` 107752 4042680 97.40 425180 1293196 3970036 126496 3.09 160
` 107628 4042804 97.41 425180 1293520 3970036 126496 3.09 160
디스크 통계
[root@master ~]# sar -b | more
Linux 2.6.18-128.el5PAE (ns2) 2013년 09월 02일
` tps rtps wtps bread/s bwrtn/s
` 2.86 0.00 2.86 0.00 41.03
` 2.80 0.00 2.80 0.00 39.89
` 2.77 0.00 2.77 0.00 39.75
` 4.35 0.00 4.35 0.00 136.21
` 2.84 0.00 2.84 0.00 40.20
` 2.77 0.00 2.77 0.00 39.27
초당 총 트랜잭션 수(tps)를 알 수 있고 추가적으로 얼마나 많은 읽기 트랜잭션(rtps)과 쓰기 트랜잭션(wtps)이 각각 있었는지 확인할 수 있다.
bread/s 칼럼은 bread I/O를 측정하지 않는다.
대신 초당 읽은 평균 바이트 수를 보여준다. 이와 비슷하게 bwrtn/s 역시 초당 평균 바이트 수를 보여준다.
과거의 통계 정보
특정 시간 범위에 대한 데이터를 가져오려면 -s와 -e 인자를 사용해 관심 있는 시간대의 시작 시간과 종료 시간을 각각 명시할 수 있다.
[root@master ~]# sar -s 14:00:00 -e 16:00:00 | more
Linux 2.6.18-128.el5PAE (ns2) 2013년 09월 02일
` CPU %user %nice %system %iowait %steal %idle
` all 1.34 0.00 1.23 5.39 0.00 92.05
` all 2.60 0.00 2.80 19.07 0.00 75.52
` all 0.93 0.00 0.91 4.00 0.00 94.16
` all 0.98 0.01 0.90 4.32 0.00 93.79
` all 0.96 0.00 0.89 4.15 0.00 94.00
` all 0.89 0.00 0.87 3.82 0.00 94.42
` all 0.93 0.00 0.89 4.19 0.00 93.99
` all 0.89 0.00 0.92 3.96 0.00 94.24
Average: all 1.18 0.00 1.17 6.04 0.00 91.61
'개발 > linux' 카테고리의 다른 글
centos7 네트워크 구성 (0) | 2017.01.02 |
---|---|
centos7 firewalld (0) | 2017.01.02 |
linux 터미널 한글 설정 (0) | 2014.12.08 |
ssh 클라이언트 설치 (0) | 2014.12.08 |
파이어폭스 flashplayer so 추가 (0) | 2014.10.07 |