奥多摩 🚲

11/19 (日) 新青梅街道をひたすら走って奥多摩 (のちょっと手前まで) の紅葉をエンジョイしてきた

f:id:hiboma:20171121003959p:plain

走行距離 109km 獲得標高は 679m で控えめ。寒くなってきてしんどいよ

続きを読む

procps-ng: sysctl の Segmentation Fault を報告

procps-ng の master の sysctl を使っていたら Segmentation Fault を起こしたので issue をオープンしといた

gitlab.com

問題のあるコミット

以下のような感じ

diff --git a/sysctl.c b/sysctl.c
index 29f31af..be05722 100644
--- a/sysctl.c
+++ b/sysctl.c
@@ -158,6 +158,8 @@ static char *StripLeadingAndTrailingSpaces(char *oneline)
 /*
  * Read a sysctl setting
  */
+#define IOBUFSIZ    (128<<10)
+static char *iobuf;
 static int ReadSetting(const char *restrict const name)
 {
    int rc = 0;
@@ -220,6 +222,9 @@ static int ReadSetting(const char *restrict const name)
 
    fp = fopen(tmpname, "r");
 
+   if (iobuf)
(fp, iobuf, _IOFBF, IOBUFSIZ);
+
    if (!fp) {
        switch (errno) {
        case ENOENT:
@@ -430,6 +435,9 @@ static int WriteSetting(const char *setting)
 
    fp = fopen(tmpname, "w");
 
+   if (iobuf)
+       setvbuf(fp, iobuf, _IOFBF, IOBUFSIZ);
+
    if (!fp) {
        switch (errno) {
        case ENOENT:
@@ -793,6 +801,8 @@ int main(int argc, char *argv[])
    argc -= optind;
    argv += optind;
 
+   iobuf = (char*)malloc(IOBUFSIZ);    /* Allow to fail */
+
    if (DisplayAllOpt)
        return DisplayAll(PROC_PATH);

非特権ユーザで sysctl を実行すると、権限が足りない場合に fopen(3) が EACCESS で失敗して NULL を返すのだが、エラーを確認せずに setvbuf(3) しちゃって ぬるぽ で ガッ SIGSEGV するのだった

$ /usr/local/sbin/sysctl net.ipv4.tcp_fastopen_key
Segmentation fault (core dumped)

$ /usr/local/sbin/sysctl -w vm.overcommit_ratio=0
Segmentation fault (core dumped)

本来は以下のような挙動をとるはず

$ /usr/local/sbin/sysctl net.ipv4.tcp_fastopen_key
sysctl: permission denied on key 'net.ipv4.tcp_fastopen_key'

$ /usr/local/sbin/sysctl -w vm.overcommit_ratio=0
sysctl: permission denied on key 'vm.overcommit_ratio'

感想

  • まだ master ブランチに入ってるだけでリリースされてないので、ささっと直してくれるだろう
  • わりと「うっかり」したバグだよなぁ
  • 何も反応なかったらパッチを送ってみよ

strace の -k オプションでスタックトレースを出す

strace で -k を指定すると システムコール呼び出しのスタックトレースを採取できるのを知った。v4.9 から使える experimental 扱いのオプション

       -k          Print  the execution stack trace of the traced processes after each system call (experimental).  This option is available only if strace is built with libunwind.
               

以下のような出力を得られる

$ strace -k ls
execve("/usr/local/bin/ls", ["ls"], 0x7ffcf3bcdd58 /* 26 vars */) = 0
 > /usr/lib64/libc-2.17.so(execve+0x7) [0xbf557]
 > /usr/local/bin/strace(exec_or_die+0x127) [0x2bd7]
 > /usr/local/bin/strace(startup_child+0x3c6) [0x24df6]
 > /usr/local/bin/strace(init+0x6c0) [0x25540]
 > /usr/local/bin/strace(main+0x16) [0x2c26]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/local/bin/strace(_start+0x29) [0x379a]
brk(NULL)                               = 0x1281000
 > /usr/lib64/ld-2.17.so(__brk+0xc) [0x1826c]
 > /usr/lib64/ld-2.17.so(_dl_sysdep_start+0x148) [0x17448]
 > /usr/lib64/ld-2.17.so(_dl_start+0x381) [0x1bc1]
 > /usr/lib64/ld-2.17.so(check_one_fd.part.0+0x7d) [0x1178]
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f93c8f7a000
 > /usr/lib64/ld-2.17.so(__mmap+0x3a) [0x18f5a]
 > /usr/lib64/ld-2.17.so(__libc_memalign+0x84) [0x17db4]
 > /usr/lib64/ld-2.17.so(_dl_init_paths+0x91) [0x7ea1]
 > /usr/lib64/ld-2.17.so(dl_main+0x154b) [0x342b]
 > /usr/lib64/ld-2.17.so(_dl_sysdep_start+0x238) [0x17538]
 > /usr/lib64/ld-2.17.so(_dl_start+0x381) [0x1bc1]
 > /usr/lib64/ld-2.17.so(check_one_fd.part.0+0x7d) [0x1178]
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
 > /usr/lib64/ld-2.17.so(access+0x7) [0x18e57]
 > /usr/lib64/ld-2.17.so(dl_main+0x1700) [0x35e0]
 > /usr/lib64/ld-2.17.so(_dl_sysdep_start+0x238) [0x17538]
 > /usr/lib64/ld-2.17.so(_dl_start+0x381) [0x1bc1]
 > /usr/lib64/ld-2.17.so(check_one_fd.part.0+0x7d) [0x1178]

...

やったー

CentOS7

CentOS7.4 の strace-4.12-4.el7 ではサポートされていない機能だ。ざんねーん

$ rpm -qf /usr/bin/strace 
strace-4.12-4.el7.x86_64

$ /usr/bin/strace -k ps
/usr/bin/strace: invalid option -- 'k'
Try '/usr/bin/strace -h' for more information.

ちなみに Ubuntu Xenial もだめだー。とほほー

ビルドする

strace を git clone してきて、libunwind, libunwind-devel をインストールしておけば ./configure が勝手に検知して有効にしてくれた

ユースケース

障害や不具合の調査では、strace でシステムコールを読んで原因を絞り込んでいくことがある。そして問題のあるシステムコールを見つけることができたとしても、アプリケーションのどのコードから呼び出されいるかを突き止めるので手間がかかったりする

一つの方法として、GDBシステムコールに breakpoint を仕掛けてバックトレースをとると解決できるが、production で使うには GDB で停止するオーバーヘッドが問題になりそうだったり (注: 計測してみたら問題ないかも。感覚の話ですいません 😳 ) 、複数のシステムコールをまとめて追いかけたい際には不便 ... という問題を解決してくれそうなオプション

システムコールから逆引きで呼び出し元のシンボルとファイル名が一覧できるので、ただ単にソースコードリーディング用のツールとしても有用そう

実行例

ps コマンドの write(2) だけに絞り込んでスタックトレースを出す

$ strace -ewrite -k ps --quick-pid 1 
write(1, "  PID TTY          TIME CMD\n", 28  PID TTY          TIME CMD
) = 28
 > /usr/lib64/libc-2.17.so(__write_nocancel+0x7) [0xe9840]
 > /usr/lib64/libc-2.17.so(_IO_file_write+0x43) [0x75fb3]
 > /usr/lib64/libc-2.17.so(_IO_do_write+0x7c) [0x7741c]
 > /usr/lib64/libc-2.17.so(_IO_file_xsputn+0xb1) [0x76651]
 > /usr/lib64/libc-2.17.so(fwrite+0xed) [0x6c03d]
 > /usr/local/bin/ps(show_one_proc+0x3d6) [0x7146]
 > /usr/local/bin/ps(main+0x8ab) [0x2b2b]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/local/bin/ps(_start+0x29) [0x2ca5]
write(1, "    1 ?        00:00:19 systemd\n", 32    1 ?        00:00:19 systemd
) = 32
 > /usr/lib64/libc-2.17.so(__write_nocancel+0x7) [0xe9840]
 > /usr/lib64/libc-2.17.so(_IO_file_write+0x43) [0x75fb3]
 > /usr/lib64/libc-2.17.so(_IO_do_write+0x7c) [0x7741c]
 > /usr/lib64/libc-2.17.so(_IO_file_xsputn+0xb1) [0x76651]
 > /usr/lib64/libc-2.17.so(fwrite+0xed) [0x6c03d]
 > /usr/local/bin/ps(main+0x8ab) [0x2b2b]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/local/bin/ps(_start+0x29) [0x2ca5]
+++ exited with 0 +++

よいかんじだ

その他の使用例

例えば -P を組み合わせるて 特定のファイルを扱うシステムコールとトレースを観察する

id コマンドと /etc/passwd をトレースすると、libc の getpwuid(3) 呼び出しと中間に libnss_files が入っているのが分かる。ライブラリ関数や .so ライブラリの関係を把握できる。

$ strace -k -P /etc/passwd -y id
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3</etc/passwd>
 > /usr/lib64/libc-2.17.so(__open_nocancel+0x7) [0xe95a0]
 > /usr/lib64/libc-2.17.so(_IO_file_fopen+0x4c4) [0x77314]
 > /usr/lib64/libc-2.17.so(__fopen_internal+0x74) [0x6b5e4]
 > /usr/lib64/libnss_files-2.17.so(_nss_files_getpwuid_r+0x113) [0x60a3]
 > /usr/lib64/libc-2.17.so(getpwuid_r+0x15e) [0xbe52e]
 > /usr/lib64/libc-2.17.so(getpwuid+0x76) [0xbdc66]
 > /usr/local/bin/id(main+0x677) [0x20e7]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/local/bin/id(_start+0x29) [0x2478]
fstat(3</etc/passwd>, {st_mode=S_IFREG|0644, st_size=1564, ...}) = 0
 > /usr/lib64/libc-2.17.so(__fxstat64+0x14) [0xe9154]
 > /usr/lib64/libc-2.17.so(_IO_file_doallocate+0x25) [0x6a9d5]
 > /usr/lib64/libc-2.17.so(_IO_doallocbuf+0x35) [0x784e5]
 > /usr/lib64/libc-2.17.so(_IO_file_underflow+0x1a4) [0x77654]
 > /usr/lib64/libc-2.17.so(_IO_default_uflow+0xe) [0x7856e]
 > /usr/lib64/libc-2.17.so(_IO_getline_info+0xa4) [0x6c514]
 > /usr/lib64/libc-2.17.so(fgets_unlocked+0x3d) [0x7569d]
 > /usr/lib64/libnss_files-2.17.so(internal_getent+0x8f) [0x5b0f]
 > /usr/lib64/libnss_files-2.17.so(_nss_files_getpwuid_r+0x81) [0x6011]
 > /usr/lib64/libc-2.17.so(getpwuid_r+0x15e) [0xbe52e]
 > /usr/lib64/libc-2.17.so(getpwuid+0x76) [0xbdc66]
 > /usr/local/bin/id(main+0x677) [0x20e7]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/local/bin/id(_start+0x29) [0x2478]
read(3</etc/passwd>, "root:x:0:0:root:/root:/bin/bash\n"..., 4096) = 1564
 > /usr/lib64/libc-2.17.so(__read_nocancel+0x7) [0xe97e0]
 > /usr/lib64/libc-2.17.so(_IO_file_read+0x17) [0x76597]
 > /usr/lib64/libc-2.17.so(_IO_file_underflow+0x130) [0x775e0]
 > /usr/lib64/libc-2.17.so(_IO_default_uflow+0xe) [0x7856e]
 > /usr/lib64/libc-2.17.so(_IO_getline_info+0xa4) [0x6c514]
 > /usr/lib64/libc-2.17.so(fgets_unlocked+0x3d) [0x7569d]
 > /usr/lib64/libnss_files-2.17.so(internal_getent+0x8f) [0x5b0f]
 > /usr/lib64/libnss_files-2.17.so(_nss_files_getpwuid_r+0x81) [0x6011]
 > /usr/lib64/libc-2.17.so(getpwuid_r+0x15e) [0xbe52e]
 > /usr/lib64/libc-2.17.so(getpwuid+0x76) [0xbdc66]
 > /usr/local/bin/id(main+0x677) [0x20e7]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/local/bin/id(_start+0x29) [0x2478]
close(3</etc/passwd>)                   = 0
 > /usr/lib64/libc-2.17.so(__close_nocancel+0x7) [0xe9e90]
 > /usr/lib64/libc-2.17.so(_IO_file_close_it+0x120) [0x76cc0]
 > /usr/lib64/libc-2.17.so(fclose+0x180) [0x6ac40]
 > /usr/lib64/libnss_files-2.17.so(_nss_files_getpwuid_r+0xe9) [0x6079]
 > /usr/lib64/libc-2.17.so(getpwuid_r+0x15e) [0xbe52e]
 > /usr/lib64/libc-2.17.so(getpwuid+0x76) [0xbdc66]
 > /usr/local/bin/id(main+0x677) [0x20e7]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/local/bin/id(_start+0x29) [0x2478]
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
+++ exited with 0 +++

その他の使用例(2)

nginx が 静的コンテンツを返すシステムコールスタックトレースを眺める。イベント駆動なコードはなかなか把握するのが辛いけど、どのフェーズでどのようなシステムコールが呼び出されるかを把握すると、追いかけやすくなる ... かな?

accept4(6<TCP:[782776]>, {sa_family=AF_INET, sin_port=htons(61829), sin_addr=inet_addr("192.168.33.1")}, [110->16], SOCK_NONBLOCK) = 3<TCP:[789563]>
 > /usr/lib64/libc-2.17.so(accept4+0x17) [0xf9787]
 > /usr/sbin/nginx(ngx_event_accept+0xef) [0x40aef]
 > /usr/sbin/nginx(ngx_os_specific_status+0xb61) [0x4a771]
 > /usr/sbin/nginx(ngx_process_events_and_timers+0x6a) [0x401da]
 > /usr/sbin/nginx(ngx_dlerror+0x9e5) [0x47da5]
 > /usr/sbin/nginx(ngx_spawn_process+0x18a) [0x4670a]
 > /usr/sbin/nginx(ngx_dlerror+0xca0) [0x48060]
 > /usr/sbin/nginx(ngx_master_process_cycle+0x46d) [0x491bd]
 > /usr/sbin/nginx(main+0x899) [0x20889]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/sbin/nginx(_start+0x29) [0x20c1e]
epoll_ctl(17<anon_inode:[eventpoll]>, EPOLL_CTL_ADD, 3<TCP:[789563]>, {EPOLLIN|EPOLLRDHUP|EPOLLET, {u32=729518769, u64=139758965330609}}) = 0
 > /usr/lib64/libc-2.17.so(epoll_ctl+0xa) [0xf88ca]
 > /usr/sbin/nginx(ngx_os_specific_status+0x29b) [0x49eab]
 > /usr/sbin/nginx(ngx_handle_read_event+0xa0) [0x40390]
 > /usr/sbin/nginx(ngx_http_init_connection+0x31b) [0x5f2ab]
 > /usr/sbin/nginx(ngx_event_accept+0x473) [0x40e73]
 > /usr/sbin/nginx(ngx_os_specific_status+0xb61) [0x4a771]
 > /usr/sbin/nginx(ngx_process_events_and_timers+0x6a) [0x401da]
 > /usr/sbin/nginx(ngx_dlerror+0x9e5) [0x47da5]
 > /usr/sbin/nginx(ngx_spawn_process+0x18a) [0x4670a]
 > /usr/sbin/nginx(ngx_dlerror+0xca0) [0x48060]
 > /usr/sbin/nginx(ngx_master_process_cycle+0x46d) [0x491bd]
 > /usr/sbin/nginx(main+0x899) [0x20889]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/sbin/nginx(_start+0x29) [0x20c1e]
recvfrom(3<TCP:[789563]>, "GET / HTTP/1.1\r\nHost: 192.168.33.10\r\nUser-Agent: curl/7.52.1\r\nAccept: */*\r\n\r\n", 1024, 0, NULL, NULL) = 77
 > /usr/lib64/libpthread-2.17.so(recv+0x1d) [0xea3d]
 > /usr/sbin/nginx(ngx_unix_recv+0x62) [0x44dc2]
 > /usr/sbin/nginx(ngx_http_process_request+0xb7d) [0x62d2d]
 > /usr/sbin/nginx(ngx_os_specific_status+0xb61) [0x4a771]
 > /usr/sbin/nginx(ngx_process_events_and_timers+0x6a) [0x401da]
 > /usr/sbin/nginx(ngx_dlerror+0x9e5) [0x47da5]
 > /usr/sbin/nginx(ngx_spawn_process+0x18a) [0x4670a]
 > /usr/sbin/nginx(ngx_dlerror+0xca0) [0x48060]
 > /usr/sbin/nginx(ngx_master_process_cycle+0x46d) [0x491bd]
 > /usr/sbin/nginx(main+0x899) [0x20889]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/sbin/nginx(_start+0x29) [0x20c1e]
stat("/usr/share/nginx/html/index.html", {st_mode=S_IFREG|0644, st_size=3700, ...}) = 0
 > /usr/lib64/libc-2.17.so(__xstat64+0x15) [0xe9105]
 > /usr/sbin/nginx(ngx_resolve_addr+0x37a5) [0x3ca75]
 > /usr/sbin/nginx(ngx_open_cached_file+0x336) [0x3d3d6]
 > /usr/sbin/nginx(ngx_http_v2_huff_encode+0x4967) [0x9c5f7]
 > /usr/sbin/nginx(ngx_http_core_content_phase+0x7a) [0x5ba1a]
 > /usr/sbin/nginx(ngx_http_core_run_phases+0x25) [0x55ce5]
 > /usr/sbin/nginx(ngx_http_process_request+0xae) [0x6225e]
 > /usr/sbin/nginx(ngx_http_process_request+0xa8c) [0x62c3c]
 > /usr/sbin/nginx(ngx_os_specific_status+0xb61) [0x4a771]
 > /usr/sbin/nginx(ngx_process_events_and_timers+0x6a) [0x401da]
 > /usr/sbin/nginx(ngx_dlerror+0x9e5) [0x47da5]
 > /usr/sbin/nginx(ngx_spawn_process+0x18a) [0x4670a]
 > /usr/sbin/nginx(ngx_dlerror+0xca0) [0x48060]
 > /usr/sbin/nginx(ngx_master_process_cycle+0x46d) [0x491bd]
 > /usr/sbin/nginx(main+0x899) [0x20889]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/sbin/nginx(_start+0x29) [0x20c1e]
open("/usr/share/nginx/html/index.html", O_RDONLY|O_NONBLOCK) = 4</usr/share/nginx/html/index.html>
 > /usr/lib64/libpthread-2.17.so(__open_nocancel+0x7) [0xee90]
 > /usr/sbin/nginx(ngx_resolve_addr+0x3428) [0x3c6f8]
 > /usr/sbin/nginx(ngx_resolve_addr+0x38fa) [0x3cbca]
 > /usr/sbin/nginx(ngx_open_cached_file+0x1d0) [0x3d270]
 > /usr/sbin/nginx(ngx_http_v2_huff_encode+0x7e7) [0x98477]
 > /usr/sbin/nginx(ngx_http_core_content_phase+0x7a) [0x5ba1a]
 > /usr/sbin/nginx(ngx_http_core_run_phases+0x25) [0x55ce5]
 > /usr/sbin/nginx(ngx_http_internal_redirect+0x129) [0x5c7b9]
 > /usr/sbin/nginx(ngx_http_v2_huff_encode+0x4d28) [0x9c9b8]
 > /usr/sbin/nginx(ngx_http_core_content_phase+0x7a) [0x5ba1a]
 > /usr/sbin/nginx(ngx_http_core_run_phases+0x25) [0x55ce5]
 > /usr/sbin/nginx(ngx_http_process_request+0xae) [0x6225e]
 > /usr/sbin/nginx(ngx_http_process_request+0xa8c) [0x62c3c]
 > /usr/sbin/nginx(ngx_os_specific_status+0xb61) [0x4a771]
 > /usr/sbin/nginx(ngx_process_events_and_timers+0x6a) [0x401da]
 > /usr/sbin/nginx(ngx_dlerror+0x9e5) [0x47da5]
 > /usr/sbin/nginx(ngx_spawn_process+0x18a) [0x4670a]
 > /usr/sbin/nginx(ngx_dlerror+0xca0) [0x48060]
 > /usr/sbin/nginx(ngx_master_process_cycle+0x46d) [0x491bd]
 > /usr/sbin/nginx(main+0x899) [0x20889]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/sbin/nginx(_start+0x29) [0x20c1e]
fstat(4</usr/share/nginx/html/index.html>, {st_mode=S_IFREG|0644, st_size=3700, ...}) = 0
 > /usr/lib64/libc-2.17.so(__fxstat64+0x14) [0xe9154]
 > /usr/sbin/nginx(ngx_resolve_addr+0x3914) [0x3cbe4]
 > /usr/sbin/nginx(ngx_open_cached_file+0x1d0) [0x3d270]
 > /usr/sbin/nginx(ngx_http_v2_huff_encode+0x7e7) [0x98477]
 > /usr/sbin/nginx(ngx_http_core_content_phase+0x7a) [0x5ba1a]
 > /usr/sbin/nginx(ngx_http_core_run_phases+0x25) [0x55ce5]
 > /usr/sbin/nginx(ngx_http_internal_redirect+0x129) [0x5c7b9]
 > /usr/sbin/nginx(ngx_http_v2_huff_encode+0x4d28) [0x9c9b8]
 > /usr/sbin/nginx(ngx_http_core_content_phase+0x7a) [0x5ba1a]
 > /usr/sbin/nginx(ngx_http_core_run_phases+0x25) [0x55ce5]
 > /usr/sbin/nginx(ngx_http_process_request+0xae) [0x6225e]
 > /usr/sbin/nginx(ngx_http_process_request+0xa8c) [0x62c3c]
 > /usr/sbin/nginx(ngx_os_specific_status+0xb61) [0x4a771]
 > /usr/sbin/nginx(ngx_process_events_and_timers+0x6a) [0x401da]
 > /usr/sbin/nginx(ngx_dlerror+0x9e5) [0x47da5]
 > /usr/sbin/nginx(ngx_spawn_process+0x18a) [0x4670a]
 > /usr/sbin/nginx(ngx_dlerror+0xca0) [0x48060]
 > /usr/sbin/nginx(ngx_master_process_cycle+0x46d) [0x491bd]
 > /usr/sbin/nginx(main+0x899) [0x20889]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/sbin/nginx(_start+0x29) [0x20c1e]
setsockopt(3<TCP:[789563]>, SOL_TCP, TCP_CORK, [1], 4) = 0
 > /usr/lib64/libc-2.17.so(setsockopt+0xa) [0xf946a]
 > /usr/sbin/nginx(ngx_tcp_nopush+0x36) [0x44cd6]
 > /usr/sbin/nginx(ngx_linux_sendfile_chain+0x40d) [0x4b58d]
 > /usr/sbin/nginx(ngx_http_write_filter+0x4f0) [0x7f090]
 > /usr/sbin/nginx(ngx_http_write_filter+0x1786) [0x80326]
 > /usr/sbin/nginx(ngx_http_write_filter+0x53cc) [0x83f6c]
 > /usr/sbin/nginx(ngx_http_write_filter+0x86ec) [0x8728c]
 > /usr/sbin/nginx(ngx_http_write_filter+0xbbea) [0x8a78a]
 > /usr/lib64/nginx/modules/ngx_http_xslt_filter_module.so(_init+0x158c) [0x2d2c]
 > /usr/lib64/nginx/modules/ngx_http_image_filter_module.so(_init+0x1b88) [0x3148]
 > /usr/sbin/nginx(ngx_http_write_filter+0xdedf) [0x8ca7f]
 > /usr/sbin/nginx(ngx_http_write_filter+0xe72c) [0x8d2cc]
 > /usr/sbin/nginx(ngx_output_chain+0x8f8) [0x25de8]
 > /usr/sbin/nginx(ngx_http_write_filter+0x1095e) [0x8f4fe]
 > /usr/sbin/nginx(ngx_http_write_filter+0x110fe) [0x8fc9e]
 > /usr/sbin/nginx(ngx_http_output_filter+0x2a) [0x5b53a]
 > /usr/sbin/nginx(ngx_http_v2_huff_encode+0xb8e) [0x9881e]
 > /usr/sbin/nginx(ngx_http_core_content_phase+0x7a) [0x5ba1a]
 > /usr/sbin/nginx(ngx_http_core_run_phases+0x25) [0x55ce5]
 > /usr/sbin/nginx(ngx_http_internal_redirect+0x129) [0x5c7b9]
 > /usr/sbin/nginx(ngx_http_v2_huff_encode+0x4d28) [0x9c9b8]
 > /usr/sbin/nginx(ngx_http_core_content_phase+0x7a) [0x5ba1a]
 > /usr/sbin/nginx(ngx_http_core_run_phases+0x25) [0x55ce5]
 > /usr/sbin/nginx(ngx_http_process_request+0xae) [0x6225e]
 > /usr/sbin/nginx(ngx_http_process_request+0xa8c) [0x62c3c]
 > /usr/sbin/nginx(ngx_os_specific_status+0xb61) [0x4a771]
 > /usr/sbin/nginx(ngx_process_events_and_timers+0x6a) [0x401da]
 > /usr/sbin/nginx(ngx_dlerror+0x9e5) [0x47da5]
 > /usr/sbin/nginx(ngx_spawn_process+0x18a) [0x4670a]
 > /usr/sbin/nginx(ngx_dlerror+0xca0) [0x48060]
 > /usr/sbin/nginx(ngx_master_process_cycle+0x46d) [0x491bd]
 > /usr/sbin/nginx(main+0x899) [0x20889]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/sbin/nginx(_start+0x29) [0x20c1e]
writev(3<TCP:[789563]>, [{iov_base="HTTP/1.1 200 OK\r\nServer: nginx/1.10.2\r\nDate: Wed, 08 Nov 2017 05:33:40 GMT\r\nContent-Type: text/html\r\nContent-Length: 3700\r\nLast-Modified: Mon, 18 Sep 2017 09:18:55 GMT\r\nConnection:"..., iov_len=239}], 1) = 239
 > /usr/lib64/libc-2.17.so(writev+0x17) [0xef1e7]
 > /usr/sbin/nginx(ngx_writev+0x19) [0x45529]
 > /usr/sbin/nginx(ngx_linux_sendfile_chain+0x182) [0x4b302]
 > /usr/sbin/nginx(ngx_http_write_filter+0x4f0) [0x7f090]
 > /usr/sbin/nginx(ngx_http_write_filter+0x1786) [0x80326]
 > /usr/sbin/nginx(ngx_http_write_filter+0x53cc) [0x83f6c]
 > /usr/sbin/nginx(ngx_http_write_filter+0x86ec) [0x8728c]
 > /usr/sbin/nginx(ngx_http_write_filter+0xbbea) [0x8a78a]
 > /usr/lib64/nginx/modules/ngx_http_xslt_filter_module.so(_init+0x158c) [0x2d2c]
 > /usr/lib64/nginx/modules/ngx_http_image_filter_module.so(_init+0x1b88) [0x3148]
 > /usr/sbin/nginx(ngx_http_write_filter+0xdedf) [0x8ca7f]
 > /usr/sbin/nginx(ngx_http_write_filter+0xe72c) [0x8d2cc]
 > /usr/sbin/nginx(ngx_output_chain+0x8f8) [0x25de8]
 > /usr/sbin/nginx(ngx_http_write_filter+0x1095e) [0x8f4fe]
 > /usr/sbin/nginx(ngx_http_write_filter+0x110fe) [0x8fc9e]
 > /usr/sbin/nginx(ngx_http_output_filter+0x2a) [0x5b53a]
 > /usr/sbin/nginx(ngx_http_v2_huff_encode+0xb8e) [0x9881e]
 > /usr/sbin/nginx(ngx_http_core_content_phase+0x7a) [0x5ba1a]
 > /usr/sbin/nginx(ngx_http_core_run_phases+0x25) [0x55ce5]
 > /usr/sbin/nginx(ngx_http_internal_redirect+0x129) [0x5c7b9]
 > /usr/sbin/nginx(ngx_http_v2_huff_encode+0x4d28) [0x9c9b8]
 > /usr/sbin/nginx(ngx_http_core_content_phase+0x7a) [0x5ba1a]
 > /usr/sbin/nginx(ngx_http_core_run_phases+0x25) [0x55ce5]
 > /usr/sbin/nginx(ngx_http_process_request+0xae) [0x6225e]
 > /usr/sbin/nginx(ngx_http_process_request+0xa8c) [0x62c3c]
 > /usr/sbin/nginx(ngx_os_specific_status+0xb61) [0x4a771]
 > /usr/sbin/nginx(ngx_process_events_and_timers+0x6a) [0x401da]
 > /usr/sbin/nginx(ngx_dlerror+0x9e5) [0x47da5]
 > /usr/sbin/nginx(ngx_spawn_process+0x18a) [0x4670a]
 > /usr/sbin/nginx(ngx_dlerror+0xca0) [0x48060]
 > /usr/sbin/nginx(ngx_master_process_cycle+0x46d) [0x491bd]
 > /usr/sbin/nginx(main+0x899) [0x20889]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/sbin/nginx(_start+0x29) [0x20c1e]
sendfile(3<TCP:[789563]>, 4</usr/share/nginx/html/index.html>, [0] => [3700], 3700) = 3700
 > /usr/lib64/libc-2.17.so(sendfile+0xa) [0xedd6a]
 > /usr/sbin/nginx(ngx_linux_sendfile_chain+0x28d) [0x4b40d]
 > /usr/sbin/nginx(ngx_http_write_filter+0x4f0) [0x7f090]
 > /usr/sbin/nginx(ngx_http_write_filter+0x1786) [0x80326]
 > /usr/sbin/nginx(ngx_http_write_filter+0x53cc) [0x83f6c]
 > /usr/sbin/nginx(ngx_http_write_filter+0x86ec) [0x8728c]
 > /usr/sbin/nginx(ngx_http_write_filter+0xbbea) [0x8a78a]
 > /usr/lib64/nginx/modules/ngx_http_xslt_filter_module.so(_init+0x158c) [0x2d2c]
 > /usr/lib64/nginx/modules/ngx_http_image_filter_module.so(_init+0x1b88) [0x3148]
 > /usr/sbin/nginx(ngx_http_write_filter+0xdedf) [0x8ca7f]
 > /usr/sbin/nginx(ngx_http_write_filter+0xe72c) [0x8d2cc]
 > /usr/sbin/nginx(ngx_output_chain+0x8f8) [0x25de8]
 > /usr/sbin/nginx(ngx_http_write_filter+0x1095e) [0x8f4fe]
 > /usr/sbin/nginx(ngx_http_write_filter+0x110fe) [0x8fc9e]
 > /usr/sbin/nginx(ngx_http_output_filter+0x2a) [0x5b53a]
 > /usr/sbin/nginx(ngx_http_v2_huff_encode+0xb8e) [0x9881e]
 > /usr/sbin/nginx(ngx_http_core_content_phase+0x7a) [0x5ba1a]
 > /usr/sbin/nginx(ngx_http_core_run_phases+0x25) [0x55ce5]
 > /usr/sbin/nginx(ngx_http_internal_redirect+0x129) [0x5c7b9]
 > /usr/sbin/nginx(ngx_http_v2_huff_encode+0x4d28) [0x9c9b8]
 > /usr/sbin/nginx(ngx_http_core_content_phase+0x7a) [0x5ba1a]
 > /usr/sbin/nginx(ngx_http_core_run_phases+0x25) [0x55ce5]
 > /usr/sbin/nginx(ngx_http_process_request+0xae) [0x6225e]
 > /usr/sbin/nginx(ngx_http_process_request+0xa8c) [0x62c3c]
 > /usr/sbin/nginx(ngx_os_specific_status+0xb61) [0x4a771]
 > /usr/sbin/nginx(ngx_process_events_and_timers+0x6a) [0x401da]
 > /usr/sbin/nginx(ngx_dlerror+0x9e5) [0x47da5]
 > /usr/sbin/nginx(ngx_spawn_process+0x18a) [0x4670a]
 > /usr/sbin/nginx(ngx_dlerror+0xca0) [0x48060]
 > /usr/sbin/nginx(ngx_master_process_cycle+0x46d) [0x491bd]
 > /usr/sbin/nginx(main+0x899) [0x20889]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/sbin/nginx(_start+0x29) [0x20c1e]
write(16</var/log/nginx/access.log>, "192.168.33.1 - - [08/Nov/2017:05:33:40 +0000] \"GET / HTTP/1.1\" 200 3700 \"-\" \"curl/7.52.1\" \"-\"\n", 94) = 94
 > /usr/lib64/libpthread-2.17.so(__write_nocancel+0x7) [0xe690]
 > /usr/sbin/nginx(ngx_http_parse_chunked+0x20f4) [0x685a4]
 > /usr/sbin/nginx(ngx_http_parse_chunked+0x28aa) [0x68d5a]
 > /usr/sbin/nginx(ngx_http_filter_finalize_request+0x110) [0x5e030]
 > /usr/sbin/nginx(ngx_http_free_request+0xbc) [0x5fccc]
 > /usr/sbin/nginx(ngx_http_block_reading+0x313) [0x608f3]
 > /usr/sbin/nginx(ngx_http_core_content_phase+0xcb) [0x5ba6b]
 > /usr/sbin/nginx(ngx_http_core_run_phases+0x25) [0x55ce5]
 > /usr/sbin/nginx(ngx_http_process_request+0xae) [0x6225e]
 > /usr/sbin/nginx(ngx_http_process_request+0xa8c) [0x62c3c]
 > /usr/sbin/nginx(ngx_os_specific_status+0xb61) [0x4a771]
 > /usr/sbin/nginx(ngx_process_events_and_timers+0x6a) [0x401da]
 > /usr/sbin/nginx(ngx_dlerror+0x9e5) [0x47da5]
 > /usr/sbin/nginx(ngx_spawn_process+0x18a) [0x4670a]
 > /usr/sbin/nginx(ngx_dlerror+0xca0) [0x48060]
 > /usr/sbin/nginx(ngx_master_process_cycle+0x46d) [0x491bd]
 > /usr/sbin/nginx(main+0x899) [0x20889]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/sbin/nginx(_start+0x29) [0x20c1e]
close(4</usr/share/nginx/html/index.html>) = 0
 > /usr/lib64/libpthread-2.17.so(__close_nocancel+0x7) [0xe750]
 > /usr/sbin/nginx(ngx_pool_cleanup_file+0x19) [0x23199]
 > /usr/sbin/nginx(ngx_destroy_pool+0x1e) [0x232ae]
 > /usr/sbin/nginx(ngx_http_free_request+0x121) [0x5fd31]
 > /usr/sbin/nginx(ngx_http_block_reading+0x313) [0x608f3]
 > /usr/sbin/nginx(ngx_http_core_content_phase+0xcb) [0x5ba6b]
 > /usr/sbin/nginx(ngx_http_core_run_phases+0x25) [0x55ce5]
 > /usr/sbin/nginx(ngx_http_process_request+0xae) [0x6225e]
 > /usr/sbin/nginx(ngx_http_process_request+0xa8c) [0x62c3c]
 > /usr/sbin/nginx(ngx_os_specific_status+0xb61) [0x4a771]
 > /usr/sbin/nginx(ngx_process_events_and_timers+0x6a) [0x401da]
 > /usr/sbin/nginx(ngx_dlerror+0x9e5) [0x47da5]
 > /usr/sbin/nginx(ngx_spawn_process+0x18a) [0x4670a]
 > /usr/sbin/nginx(ngx_dlerror+0xca0) [0x48060]
 > /usr/sbin/nginx(ngx_master_process_cycle+0x46d) [0x491bd]
 > /usr/sbin/nginx(main+0x899) [0x20889]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/sbin/nginx(_start+0x29) [0x20c1e]
setsockopt(3<TCP:[789563]>, SOL_TCP, TCP_CORK, [0], 4) = 0
 > /usr/lib64/libc-2.17.so(setsockopt+0xa) [0xf946a]
 > /usr/sbin/nginx(ngx_tcp_push+0x36) [0x44d36]
 > /usr/sbin/nginx(ngx_http_block_reading+0xac1) [0x610a1]
 > /usr/sbin/nginx(ngx_http_core_content_phase+0xcb) [0x5ba6b]
 > /usr/sbin/nginx(ngx_http_core_run_phases+0x25) [0x55ce5]
 > /usr/sbin/nginx(ngx_http_process_request+0xae) [0x6225e]
 > /usr/sbin/nginx(ngx_http_process_request+0xa8c) [0x62c3c]
 > /usr/sbin/nginx(ngx_os_specific_status+0xb61) [0x4a771]
 > /usr/sbin/nginx(ngx_process_events_and_timers+0x6a) [0x401da]
 > /usr/sbin/nginx(ngx_dlerror+0x9e5) [0x47da5]
 > /usr/sbin/nginx(ngx_spawn_process+0x18a) [0x4670a]
 > /usr/sbin/nginx(ngx_dlerror+0xca0) [0x48060]
 > /usr/sbin/nginx(ngx_master_process_cycle+0x46d) [0x491bd]
 > /usr/sbin/nginx(main+0x899) [0x20889]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/sbin/nginx(_start+0x29) [0x20c1e]
recvfrom(3<TCP:[789563]>, "", 1024, 0, NULL, NULL) = 0
 > /usr/lib64/libpthread-2.17.so(recv+0x1d) [0xea3d]
 > /usr/sbin/nginx(ngx_unix_recv+0x62) [0x44dc2]
 > /usr/sbin/nginx(ngx_http_process_request+0x14fa) [0x636aa]
 > /usr/sbin/nginx(ngx_event_process_posted+0x53) [0x40783]
 > /usr/sbin/nginx(ngx_dlerror+0x9e5) [0x47da5]
 > /usr/sbin/nginx(ngx_spawn_process+0x18a) [0x4670a]
 > /usr/sbin/nginx(ngx_dlerror+0xca0) [0x48060]
 > /usr/sbin/nginx(ngx_master_process_cycle+0x46d) [0x491bd]
 > /usr/sbin/nginx(main+0x899) [0x20889]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/sbin/nginx(_start+0x29) [0x20c1e]
close(3<TCP:[789563]>)                  = 0
 > /usr/lib64/libpthread-2.17.so(__close_nocancel+0x7) [0xe750]
 > /usr/sbin/nginx(ngx_close_connection+0x130) [0x30800]
 > /usr/sbin/nginx(ngx_http_close_connection+0x50) [0x5ea30]
 > /usr/sbin/nginx(ngx_event_process_posted+0x53) [0x40783]
 > /usr/sbin/nginx(ngx_dlerror+0x9e5) [0x47da5]
 > /usr/sbin/nginx(ngx_spawn_process+0x18a) [0x4670a]
 > /usr/sbin/nginx(ngx_dlerror+0xca0) [0x48060]
 > /usr/sbin/nginx(ngx_master_process_cycle+0x46d) [0x491bd]
 > /usr/sbin/nginx(main+0x899) [0x20889]
 > /usr/lib64/libc-2.17.so(__libc_start_main+0xf5) [0x21c05]
 > /usr/sbin/nginx(_start+0x29) [0x20c1e]

ソケットプログラミングのお勉強になる

感想

  • ソースコードリーディングがはかどる
  • 障害や不具合解決でもはかどりそう。事例ができたら紹介したい
  • だがしかし、experimental なのでディストリビューションではサポートされない可能性が高いため、ビルドが面倒だ

脇道の話: コミットの歴史

strace-plus として fork されていたコードが本家に還元されたという経緯があるらしい

github.com

Based on the code that was originally taken from strace-plus of Philip J. Guo. とのこと

だがしかし strace-plus は既に閉じてしまったプロジェクトだ https://code.google.com/archive/p/strace-plus/

Disclaimer: As of Jan 2012, this project is unsupported. Features from strace-plus have been merged into the official strace as the -k option, starting from version 4.9."

那須〜R294〜筑波山 🚲

11//5(日) 那須から国道294号線を南下して筑波山まで走った

f:id:hiboma:20171106221758p:plain

夏に国道4号線で東京に南下するルートを走破したので、今回は国道294号線を南下して筑波山を目指した

続きを読む

procps-ng: top の Forest View と Graph

procps-ngリポジトリの master をビルドして、 top を実行したらデフォルトの UI がガラっと変わっているのに気がついた

f:id:hiboma:20171107165503p:plain

さらに A を押すとカラフル

f:id:hiboma:20171108002042p:plain

以降調べたこと

Forest-View-Mode と Graph

プロセスをツリー状に表示するのは Forest View と呼ぶらしい

f:id:hiboma:20171108001937p:plain

CPUやメモリのメーター表示は Graph と呼ぶらしい

f:id:hiboma:20171108001950p:plain

コミットログ

Graph 表示を追加したのは以下のコミット (v.3.3.10 でリリース)

gitlab.com

デフォルトを Forest View に切り替えたのは以下のコミット (v.3.3.10 でリリース)

gitlab.com

注: Forest View 自体がどこで導入されたのかは追いきれてない

CentOS7

CentOS7.4 (1708) の top は procps-ng-3.3.10-16.el7 で、どちらも使える機能なのだが全く知らずに過ごしていた

理由を探るべくパッケージの spec ファイルを rpms/procps-ng.git - git.centos.org で確認したところ、以下のオプションによって 新しいモードをデフォルトでは使わない指定になっているのだった。 ΩΩΩ<ナ、ナンダッテー

            --disable-modern-top

RHEL の意向なのかなぁ。仕様をガラっと変えたくないとか

CentOS7 で新しいモード を有効にしたい場合

  • top 起動
  • V を押す ... Forest-View-Mode にする
  • 1 を押す ... 論理CPU を全て表示する
  • m を押す ... メモリの Graph を表示する
  • t を押す ... CPU の Graph を表示する
  • c を押す ... コマンドラインをフル表示する

とすると現在の master 版とほぼ同じ UI に変身する。繰り返すが全然知らなかったな

感想

  • 手に馴染んで使ってるツールほど 新しい機能や良いやり方に気がつかないってのはあるある
  • 強制的に新しいのにシフトさせることで再学習やアンラーニングを促す効果もあろう (Apple ぽい)
  • 障害や不具合調査する際には top は必須コマンドだが、バージョンが違うとショートカットキーの違いで思うように操作できないことがあって、緊急時に困ったりはする

procps-ng / top は継続的に開発が続けられていて、新しいカーネルの仕様変更の追随や NUMA や LXC への対応や、現在は UTF-8 化などが進められている。今後の進化にも期待だ〜

鬼怒川〜日塩もみじライン〜塩原 🚲

11/4(土) 宇都宮〜鬼怒川〜もみじライン〜塩原を走ってきた。走行距離 104km, 獲得標高 1490m

f:id:hiboma:20171106144529p:plain

午後に天気が荒れてしまったが ☔🌀 、紅葉のヒルクライムをたのしむことができた

続きを読む

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