util-linux の lsmem と chmem の素振り

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

-JJSON でも出せる。いまどきっぽい

[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 というシンボルだった

f:id:hiboma:20171103194914p:plain

ぬーん。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 のメモリ割当ては一体どうなっているのだろう? 不思議なサイズのブロックが並んでいる