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
感想