util-linux のコミットを追いかけていて lsmem と chmem を見つけたので、なんとなしにコマンドの素振り ⚾
環境
- kernel 4.14.0-rc7-next-20171102
- util-linux の master ( 4707bc83e1ff6b634fb4ed38c8050b34fc2487a1 )
lsmem
lsmem で メモリブロック を一覧する
[vagrant@localhost util-linux]$ ./lsmem RANGE SIZE STATE REMOVABLE BLOCK 0x0000000000000000-0x0000000017ffffff 384M online no 0-2 0x0000000018000000-0x000000001fffffff 128M online yes 3 0x0000000020000000-0x0000000027ffffff 128M online no 4 0x0000000028000000-0x000000002fffffff 128M online yes 5 0x0000000030000000-0x000000003fffffff 256M online no 6-7 0x0000000040000000-0x0000000047ffffff 128M online yes 8 0x0000000048000000-0x000000004fffffff 128M online no 9 0x0000000050000000-0x0000000057ffffff 128M online yes 10 0x0000000058000000-0x00000000dfffffff 2.1G online no 11-27 0x0000000100000000-0x000000011fffffff 512M online no 32-35 Memory block size: 128M Total online memory: 4G Total offline memory: 0B
-J
で JSON でも出せる。いまどきっぽい
[vagrant@localhost util-linux]$ ./lsmem -J { "memory": [ {"range": "0x0000000000000000-0x0000000017ffffff", "size": "384M", "state": "online", "removable": "no", "block": "0-2"}, {"range": "0x0000000018000000-0x000000001fffffff", "size": "128M", "state": "online", "removable": "yes", "block": "3"}, {"range": "0x0000000020000000-0x0000000027ffffff", "size": "128M", "state": "online", "removable": "no", "block": "4"}, {"range": "0x0000000028000000-0x000000002fffffff", "size": "128M", "state": "online", "removable": "yes", "block": "5"}, {"range": "0x0000000030000000-0x000000003fffffff", "size": "256M", "state": "online", "removable": "no", "block": "6-7"}, {"range": "0x0000000040000000-0x0000000047ffffff", "size": "128M", "state": "online", "removable": "yes", "block": "8"}, {"range": "0x0000000048000000-0x000000004fffffff", "size": "128M", "state": "online", "removable": "no", "block": "9"}, {"range": "0x0000000050000000-0x0000000057ffffff", "size": "128M", "state": "online", "removable": "yes", "block": "10"}, {"range": "0x0000000058000000-0x00000000dfffffff", "size": "2.1G", "state": "online", "removable": "no", "block": "11-27"}, {"range": "0x0000000100000000-0x000000011fffffff", "size": "512M", "state": "online", "removable": "no", "block": "32-35"} ] }
chmem でオフラインにする
REMOVABLE yes
なメモリは offline にできるらしい。以下のコマンドを実行する
[vagrant@localhost util-linux]$ sudo ./chmem -d 0x0000000018000000-0x000000001fffffff
... ところがどっこい、実行後 system 時間が 100% になって刺さってしまった。 perf top
でみてみると __offline_pages というシンボルだった
ぬーん。strace(3) すると下記のようなシステムコールが並ぶ
access("/sys/devices/system/memory/memory0/valid_zones", F_OK) = 0 open("/sys/devices/system/memory/memory3/state", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=4096, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f16de7b5000 read(3, "online\n", 4096) = 7 close(3) = 0 munmap(0x7f16de7b5000, 4096) = 0 open("/sys/devices/system/memory/memory3/valid_zones", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0444, st_size=4096, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f16de7b5000 read(3, "Movable\n", 4096) = 8 close(3) = 0 munmap(0x7f16de7b5000, 4096) = 0 open("/sys/devices/system/memory/memory3/state", O_WRONLY|O_CLOEXEC) = 3 write(3, "offline", 7 🔥
🔥 で刺さっとる
(推測)オフラインにする際にページを別のメモリブロックに移動したりするんだろけど、そこが大変なのだろか
別のレンジを offline にする
$ sudo ./chmem -d 0x0000000028000000-0x000000002fffffff
[vagrant@localhost util-linux]$ ./lsmem RANGE SIZE STATE REMOVABLE BLOCK 0x0000000000000000-0x0000000017ffffff 384M online no 0-2 0x0000000018000000-0x000000001fffffff 128M online yes 3 0x0000000020000000-0x0000000027ffffff 128M online no 4 0x0000000028000000-0x000000002fffffff 128M offline👈 - 5 0x0000000030000000-0x000000003fffffff 256M online no 6-7 0x0000000040000000-0x0000000047ffffff 128M online yes 8 0x0000000048000000-0x000000004fffffff 128M online no 9 0x0000000050000000-0x0000000057ffffff 128M online yes 10 0x0000000058000000-0x00000000dfffffff 2.1G online no 11-27 0x0000000100000000-0x000000011fffffff 512M online no 32-35 Memory block size: 128M Total online memory: 3.9G Total offline memory: 128M 👈
オンラインに戻すには以下の通り
sudo ./chmem -e 0x0000000028000000-0x000000002fffffff
感想
- Vagrant というか、VirtualBox でもメモリブロックの offline / online を試せておもろかった
- VirtualBox のメモリ割当ては一体どうなっているのだろう? 不思議なサイズのブロックが並んでいる