linux memory

27
Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4 Linuxのメモリ NSEG#21 とみたまさひろ 2011-11-12

Upload: masahiro-tomita

Post on 24-May-2015

2.058 views

Category:

Technology


6 download

TRANSCRIPT

Page 1: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

LinuxのメモリNSEG#21

とみたまさひろ2011-11-12

Page 2: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

自己紹介

とみたまさひろ

mailto:[email protected]

MySQLユーザ会

日本Rubyの会

id:tmtms

@tmtms

1/26

Page 3: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

そのサーバーメモリ足りて

ますか?2/26

Page 4: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

IaaSを活用するにはメモリの知識が重要

(知らんけど)

3/26

Page 5: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

メモリ or メモリー?

4/26

Page 6: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

メモリー

5/26

Page 7: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

メモリ不足!

6/26

Page 8: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

free

4GBの実メモリで空きが239MBしかない

% free total used free shared buffers cachedMem: 4009264 3770072 239192 <= 0 213544 2191180-/+ buffers/cache: 1365348 2643916Swap: 4194300 91368 4102932

7/26

Page 9: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

free

本当は2.6GB以上空いてる

% free total used free shared buffers cachedMem: 4009264 3770072 239192 0 213544 2191180-/+ buffers/cache: 1365348 2643916 <=Swap: 4194300 91368 4102932

8/26

Page 10: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

free

カーネルは空いているメモリをキャッシュとして有効活用してる

キャッシュとして使用しているだけでメモリ不足ではない

9/26

Page 11: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

サイズの大きいプロセスがたくさん!

10/26

Page 12: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

ps

% ps uUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDtommy 13592 0.0 2.5 104220 102812 pts/1 S 02:23 0:00 ./hogetommy 13593 0.0 2.5 104220 102460 pts/1 S 02:23 0:00 ./hogetommy 13594 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13595 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13596 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13597 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13598 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13599 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13600 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13601 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13602 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13603 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13604 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13605 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13606 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13607 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13608 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13609 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13610 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13611 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13612 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13613 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13614 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13615 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hogetommy 13616 0.0 2.5 104220 102464 pts/1 S 02:23 0:00 ./hoge

11/26

Page 13: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

メモリは共有される

親と子

実行コード

/proc/*/status

/proc/*/smaps

12/26

Page 14: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

親と子

fork() 直後はほとんどのメモリは親子間で共有されている

13/26

Page 15: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

実行コード

テキスト/データ/ヒープ/スタック

親子関係のないプロセスでも共有される

共有ライブラリも

14/26

Page 16: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

status

% cat /proc/2034/statusName: emacsState: S (sleeping)...VmPeak: 227680 kB ← 使用メモリのピーク値VmSize: 227676 kB ← 現在の使用メモリVmLck: 0 kBVmHWM: 28636 kBVmRSS: 26428 kB ← 実メモリ使用量VmData: 29096 kB ← データVmStk: 224 kB ← スタックVmExe: 1984 kB ← テキストVmLib: 22288 kB ← 共有ライブラリVmPTE: 148 kBVmSwap: 0 kB...

15/26

Page 17: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

smaps

共有と専有の状態が見える

% cat /proc/2034/smaps08048000-08238000 r-xp 00000000 08:06 663152 /usr/bin/emacs23-xSize: 1984 kBRss: 1512 kBPss: 1512 kBShared_Clean: 0 kBShared_Dirty: 0 kBPrivate_Clean: 1512 kBPrivate_Dirty: 0 kBReferenced: 1512 kBAnonymous: 0 kBAnonHugePages: 0 kBSwap: 0 kB...

16/26

Page 18: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

mmap()

ファイルをプロセスのメモリにマッピング

プロセスサイズは増える

読み込みだけならメモリを専有しない

共有してれば書き込みでも専有しない

17/26

Page 19: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

mmap()

total used free -/+ buffers/cache: 1300504 2708760 Swap: 4194300 166664 4027636 VmSize: 2712 kB VmData: 28 kB

1GB mmap() total used free -/+ buffers/cache: 1300504 2708760 Swap: 4194300 166664 4027636 VmSize: 1051288 kB VmData: 28 kB

読み込み後 total used free -/+ buffers/cache: 1304564 2704700 Swap: 4194300 166664 4027636 VmSize: 1051288 kB VmData: 28 kB

書き込み後 total used free -/+ buffers/cache: 2348624 1660640 Swap: 4194300 184260 4010040 VmSize: 1051288 kB VmData: 28 kB

18/26

Page 20: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

malloc()

malloc() に成功してもOSのメモリは確保されない

プロセスサイズは増える

領域を使った時に実際にOSのメモリが確保される

19/26

Page 21: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

malloc()

total used free -/+ buffers/cache: 1260820 2748444 Swap: 4194300 167248 4027052 VmSize: 2712 kB VmData: 28 kB

1GB malloc() total used free -/+ buffers/cache: 1260820 2748444 Swap: 4194300 167248 4027052 VmSize: 1051292 kB VmData: 1048608 kB

読み込み後 total used free -/+ buffers/cache: 1264292 2744972 Swap: 4194300 167248 4027052 VmSize: 1051292 kB VmData: 1048608 kB

書き込み後 total used free -/+ buffers/cache: 2285096 1724168 Swap: 4194300 165904 4028396 VmSize: 1051292 kB VmData: 1048608 kB

20/26

Page 22: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

じゃあ使おうとした時にメモリ足りなくなったらどうなるの?

21/26

Page 23: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

OOM Killer

22/26

Page 24: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

OOM Killer

メモリ不足時に発動する無差別殺戮者

いきなり SIGKILL で殺される

23/26

Page 25: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

OOM Killer

特定のプロセスが殺されないように

# echo -17 > /proc/PID/oom_adj

やったことないけど

24/26

Page 26: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

OOM Killer

メモリ獲得時にエラーにしたい

# sysctl -w vm.overcommit_memory=2

やったことないけど

25/26

Page 27: Linux memory

Linuxのメモリ - NSEG#21 Powered by Rabbit 1.0.4

まとめ

メモリまわりはややこしい

free を見てあわてない

OOM Killer こわい

26/26