調べ方
- /proc/[pid]/smaps で KernelPageSize がデフォルトの 4kB 以外のプロセスを探す。
調べ方の例
- /proc/[pid]/smaps で KernelPageSize が 4 kB 以外のプロセスを探す。
[root@yazekats-linux ~]# perl -lane '/KernelPageSize/ and $F[1]!=4 and print qq/$ARGV\t$_/' /proc/*/smaps /proc/3834/smaps KernelPageSize: 2048 kB
- PID:3834 のプロセス名を調べる。
[root@yazekats-linux ~]# ps -fp 3834 UID PID PPID C STIME TTY TIME CMD root 3834 3832 0 13:44 pts/0 00:00:01 /home/yazekats/Documents/github/yoheia/misc/hugepage_test/hugepage-shm
おまけ
- /proc/[pid]/smaps を覗いてみる
[root@yazekats-linux ~]# grep -C 12 'KernelPageSize: 2048 kB' /proc/3834/smaps 2aaaaac00000-2aaabac00000 rw-s 00000000 00:0b 1277985 /SYSV00000002 (deleted) <-- huge page を使っているアドレス(2aaaaac00000-2aaabac00000)やshmid(1277985) Size: 262144 kB <-- huge page を使っている合計メモリサイズ Rss: 0 kB Pss: 0 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 0 kB Referenced: 0 kB Anonymous: 0 kB AnonHugePages: 0 kB Swap: 0 kB KernelPageSize: 2048 kB <-- OSカーネルでの論理的なページサイズ MMUPageSize: 2048 kB <-- MMUでの物理的なページサイズ Locked: 0 kB 7ffff7fe0000-7ffff7fe3000 rw-p 00000000 00:00 0 Size: 12 kB Rss: 12 kB Pss: 12 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 12 kB Referenced: 12 kB Anonymous: 12 kB
- pmap コマンドでプロセスが使っているメモリの内訳を確認する
[root@yazekats-linux ~]# pmap -x 3834 3834: /home/yazekats/Documents/github/yoheia/misc/hugepage_test/hugepage-shm Address Kbytes RSS Dirty Mode Mapping 0000000000400000 4 4 4 r-x-- hugepage-shm 0000000000600000 4 4 4 rw--- hugepage-shm 0000003ba6200000 128 108 12 r-x-- ld-2.12.so 0000003ba641f000 4 4 4 r---- ld-2.12.so 0000003ba6420000 4 4 4 rw--- ld-2.12.so 0000003ba6421000 4 4 4 rw--- [ anon ] 0000003ba6600000 1580 236 0 r-x-- libc-2.12.so 0000003ba678b000 2044 0 0 ----- libc-2.12.so 0000003ba698a000 16 8 8 r---- libc-2.12.so 0000003ba698e000 4 4 4 rw--- libc-2.12.so 0000003ba698f000 20 12 12 rw--- [ anon ] 00002aaaaac00000 262144 0 0 rw-s- SYSV00000002 (deleted) <-- ここが huge page を使っている 00007ffff7fe0000 12 12 12 rw--- [ anon ] 00007ffff7ffc000 8 8 8 rw--- [ anon ] 00007ffff7ffe000 4 4 0 r-x-- [ anon ] 00007ffffffde000 132 8 8 rw--- [ stack ] ffffffffff600000 4 0 0 r-x-- [ anon ] ---------------- ------ ------ ------ total kB 266116 420 84
- ipcs コマンドで共有メモリの使用状況を見る
[root@yazekats-linux ~]# ipcs -a ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 32768 yazekats 600 393216 2 dest 0x00000000 65537 yazekats 600 393216 2 dest 0x00000000 98306 yazekats 600 393216 2 dest 0x00000000 131075 yazekats 600 393216 2 dest 0x00000000 163844 yazekats 600 393216 2 dest 0x00000000 196613 yazekats 600 393216 2 dest 0x00000000 229382 yazekats 600 393216 2 dest 0x00000000 262151 yazekats 600 393216 2 dest 0x00000000 294920 yazekats 600 393216 2 dest 0x00000000 327689 yazekats 600 393216 2 dest 0x00000000 360458 yazekats 600 393216 2 dest 0x00000000 393227 yazekats 600 393216 2 dest 0x00000000 425996 yazekats 600 393216 2 dest 0x00000000 458765 yazekats 600 393216 2 dest 0x00000000 491534 yazekats 600 393216 2 dest 0x00000000 524303 yazekats 600 393216 2 dest 0x00000000 557072 yazekats 600 393216 2 dest 0x00000000 589841 yazekats 600 393216 2 dest 0x00000000 622610 yazekats 600 393216 2 dest 0x00000000 655379 yazekats 600 393216 2 dest 0x00000000 688148 yazekats 600 393216 2 dest 0x00000000 720917 yazekats 600 393216 2 dest 0x00000000 753686 yazekats 600 393216 2 dest 0x00000000 786455 yazekats 600 393216 2 dest 0x00000000 819224 yazekats 600 393216 2 dest 0x00000000 851993 yazekats 600 393216 2 dest 0x00000000 884762 yazekats 600 393216 2 dest 0x00000000 1212443 yazekats 600 393216 2 dest 0x00000000 1245212 yazekats 600 393216 2 dest 0x00000000 983069 yazekats 600 393216 2 dest 0x00000000 1015838 yazekats 600 393216 2 dest 0x00000000 1048607 yazekats 600 393216 2 dest 0x00000000 1081376 yazekats 600 393216 2 dest 0x00000002 1277985 root 600 268435456 1 <-- ココ(shmid が 1277985) 0x00000000 1441826 yazekats 600 393216 2 dest 0x00000000 1474595 yazekats 600 393216 2 dest 0x00000000 1671204 yazekats 600 123904 2 dest 0x00000000 2392101 yazekats 600 123904 2 dest 0x00000000 2588710 yazekats 600 123904 2 dest ------ Semaphore Arrays -------- key semid owner perms nsems 0x00000000 0 root 600 1 0x00000000 163841 root 600 1 0x74012120 458754 root 644 1 0x2d012120 557059 root 600 1 ------ Message Queues -------- key msqid owner perms used-bytes messages
- shmid:1277985 にアタッチしたプロセスなどを見てみる。
[root@yazekats-linux ~]# ipcs -m -i 1277985 Shared memory Segment shmid=1277985 uid=0 gid=0 cuid=0 cgid=0 mode=0600 access_perms=0600 bytes=268435456 lpid=3834 cpid=3812 nattch=1 <-- PID:3812 が共有メモリセグメントを作成し、PID:3834 が最後にアタッチ。lpid: last-attached PID、cpid: creator PID att_time=Sat Aug 16 13:44:17 2014 det_time=Sat Aug 16 13:43:50 2014 change_time=Sat Aug 16 13:43:07 2014
再現手順
[root@yazekats-linux ~]# sysctl -w vm.nr_hugepages=200 vm.nr_hugepages = 200
- huge page を使用するプログラムを実行する
- このプログラムのソースの入手方法とコンパイル方法は hugepage-shm.c をコンパイルして実行してみる - ablog 参照
[root@yazekats-linux hugepage_test]# gdb ./hugepage-shm GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6) Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /home/yazekats/Documents/github/yoheia/misc/hugepage_test/hugepage-shm...done. (gdb) b 89 Breakpoint 1 at 0x40086f: file hugepage-shm.c, line 89. (gdb) r Starting program: /home/yazekats/Documents/github/yoheia/misc/hugepage_test/hugepage-shm shmid: 0x138021 shmaddr: 0x2aaaaac00000 Starting the writes: ................................................................................................................................................................................................................................................................ Breakpoint 1, main () at hugepage-shm.c:89 89 dprintf("Done.\n"); Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132.el6.x86_64
参考
- http://yong321.freeshell.org/oranotes/HugePages.txt
- How to list processes attached to a shared memory segment in linux? - Stack Overflow
- Note:1585358.1
追記(2015/05/19):
Java6以降では JVM はデフォルトで huge page を使用するらしいです。
Java7 と Java5 で hugepage を 使う/使わない が異なる? - ねら~ITエンジニア雑記