vmstat은 현재의 메모리의 상태를 출력하는 명령인데, process의 정보, memory의 사용량과 swap, io 및 CPU의 활동 상황에 대한 정보를 출력합니다.
필드의 설명
procs
- procs_r cpu 접근 대기 중인 실행 가능한 프로세스의 수
- procs_b I/O 자원을 할당받지 못해 block된 프로세스의 수
memory
- memory_swapd 사용된 가상메모리의 용량
- memory_free 사용가능한 여유 메모리의 용량
- memory_buffer 버퍼에 사용된 메모리의 총량
- memory_cache 페이지 캐시에 사용된 메모리의 용량
swap
- swap_si swap-in된 메모리의 양
- swap_so swap-out된 메모리의 양, swap-out가 지속적으로 발생한다면 메모리 부족을 의심
io
- io_bi block device로 부터 입력된 block 수
- io_bo bock device에 쓴 block 수
system
- system_in 초당 발생한 interrupts의 수
- system_cs 초당 발생한 context switchs 수
cpu
- cpu_us CPU가 user 수준 코드를 실행한 시간의 퍼센트
- cpu_sy CPU가 system 수준 코드를 실행한 시간의 퍼센트
- cpu_id idele 시간
- cpu_wa IO wait 시간
vmstat
1
2
3
4
| PS /root> vmstat -Sm
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 1305 654 209 2424 0 0 363 296 130 892 20 11 67 2 0
|
구현
접근할 수 있는 방법은 두 가지 정도 일 것 같습니다.
- 출력 문자열을 regex로 parse하는 방법
- 출력 문자열을 공백으로 Split해서 이름을 붙여서 parse하는 방법
regex문자열이 조금 복잡하지만, regex를 사용해서 구해보았습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| Function Get-vmstatInfo() {
Param(
[string] $Option = "-Sm"
)
If ($IsLinux) {
$cmd = "/usr/bin/vmstat"
$res = (& $cmd $Option)
Write-Debug "`n$($res -join "`n")"
$record = $res[2]
if ($record -match '^ (?<procs_r>\d+)\s+(?<procs_b>\d+)\s+(?<memory_swpd>\d+)\s+(?<memory_free>\d+)\s+(?<memory_buff>\d+)\s+(?<memory_cache>\d+)\s+(?<swap_si>\d+)\s+(?<swap_so>\d+)\s+(?<io_bi>\d+)\s+(?<io_bo>\d+)\s+(?<system_in>\d+)\s+(?<system_cs>\d+)\s+(?<cpu_us>\d+)\s+(?<cpu_sy>\d+)\s+(?<cpu_id>\d+)\s+(?<cpu_wa>\d+)\s+(?<cpu_st>\d+)\s*$') {
return $Matches
}
}
}
|
결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| PS /root> $DebugPreference = 'Continue'
PS /root> Get-vmstatInfo
DEBUG:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 3050 250 108 1969 0 0 703 465 815 191 26 14 58 2 0
Name Value
---- -----
cpu_st 0
system_cs 191
memory_cache 1969
system_in 815
procs_b 0
io_bi 703
cpu_us 26
io_bo 465
cpu_id 58
cpu_wa 2
swap_si 0
swap_so 0
cpu_sy 14
procs_r 3
memory_free 250
memory_swpd 3050
memory_buff 108
0 3 0 3050 250 108 1969 0 0 703 465 815 191 26 14 58 2 0
PS /root>
|
vmstat
명령어로 출력되는 순서대로 나오진 않았지만, hash로 출력하므로 쓸만 할 것 같습니다.
원래 감사한 문자열이 0
이라는 Property에 들어가 있네요. 그 외에는 그냥 쓸만 합니다.
레퍼런스