proc/[pid]の中身を全部読んでみる ~ attrからcpusetまで ~


概要

proc/[pid]の中身を全部読んでみるに経緯をまとめていますのでご覧いただければ幸いです。

# sleep 365d > /dev/null &
[1] 3792

# ls /proc/3792
attr             cwd       map_files   oom_adj        schedstat  task
autogroup        environ   maps        oom_score      sessionid  timers
auxv             exe       mem         oom_score_adj  setgroups  uid_map
cgroup           fd        mountinfo   pagemap        smaps      wchan
clear_refs       fdinfo    mounts      patch_state    stack
cmdline          gid_map   mountstats  personality    stat
comm             io        net         projid_map     statm
coredump_filter  limits    ns          root           status
cpuset           loginuid  numa_maps   sched          syscall

# cd /proc/3792

attr/

# ls attr/
current  exec  fscreate  keycreate  prev  sockcreate
# cat current
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
# cat prev
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

currentprev以外は空ファイルでした。
調べたところ、これらのファイルはSELinux機能で参照するようです。
Linuxではパーミッションという機能でファイルやディレクトリの読み取り、書き込み、実行権限を管理できますが、それの拡張機能がSELinuxと呼ばれる機能です。
パーミッションの代わりにSELinuxコンテキストという値で管理しているようです。

currentにはこのプロセス自身のSELinuxコンテキストが記述してあり、prevには、直前に実行されたプロセスのSELinuxコンテキストが書かれるようです。
このプロセスが作成するファイルに設定するSELinuxコンテキストはexecに書かれるようですが、
今回の/proc/3792/execは空ファイルなので、デフォルト値で作成する模様です。

デフォルト値はこちらで確認ができそうです。

# semanage login -l

Login Name           SELinux User         MLS/MCS Range        Service

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *

SELinuxの勉強は今後とします。

autogroup

# cat autogroup
/autogroup-401 nice 0

autogroupはcpuのスケジューリング(優先度)に用いるファイルです。
autogroup-401というグループ(セキュリティグループという)に所属するプロセスはデフォルトである優先度0でスケジューリングされるようです。プロセスがforkした際は同じグループに所属するため、たくさんforkしてもほかのプロセスのcpu利用を邪魔しないようです。

auxv

# ll | grep auxv
-r--------. 1 root root 0 Jan 12 05:09 auxv

# cat auxv
!寺
     d@@粟      d

捐牛゚級P吸

# od -x auxv
0000000 0021 0000 0000 0000 0000 9fbb 7fff 0000
0000020 0010 0000 0000 0000 fbff 1f8b 0000 0000
0000040 0006 0000 0000 0000 1000 0000 0000 0000
0000060 0011 0000 0000 0000 0064 0000 0000 0000
0000100 0003 0000 0000 0000 0040 0040 0000 0000
0000120 0004 0000 0000 0000 0038 0000 0000 0000
    ....

補助ベクトル (auxiliary vector)
プログラム実行時にプロセスに渡されたELFインタプリタ情報が格納されているとのこと。
カーネルはこの情報を見てメモリマップや共有ライブラリのロードなど行うっぽい。

cgroup

# cat cgroup
11:cpuset:/
10:blkio:/
9:devices:/user.slice
8:hugetlb:/
7:net_prio,net_cls:/
6:perf_event:/
5:memory:/
4:cpuacct,cpu:/
3:pids:/
2:freezer:/
1:name=systemd:/user.slice/user-1000.slice/session-89.scope

cgroupはプロセスに制限を設定できる機能です。CPU利用率やメモリの上限など細かく設定できるそうです。cgroupが設定されていたらautogroupは参照されないとのこと。autogroupの上位互換です。
左から階層ID番号 : 階層に関連付けたサブシステムの集合 : プロセスが所属する階層内のコントロールグループ
だそうです。要勉強。

clear_refs

# cat clear_refs
cat: clear_refs: Invalid argument

catしたら怒られました。write_onlyかつ書き込めるのはプロセスの所有者のみのようです。
このファイルにbitを書き込むことでプロセスに紐づくメモリ参照情報を削除でき、
clear_refsした前後の参照を確認することでプロセスのメモリ使用率を計測できるそうです。

cmdline

# cat cmdline
sleep365d

# tr \\0 _ < cmdline
sleep_365d_

プロセス起動時に実行したコマンド。引数(ls -lなど)も表示されるようです。
区切り文字は\0(NULL)でした。

comm

# cat comm
sleep

ps -cで表示されるコマンド名とのこと。

coredump_filter

# cat coredump_filter
00000033

プロセスが異常終了などした際に吐くエラーのbitフィルター設定だそうです。
00000033がそれぞれ何のマスクなのかはわかりません。

cpuset

# cat cpuset
/

cgroupで参照し、CPUとメモリの対応を限定させる機能のようです。いかにも仮想化っぽいですね。

所感

わからないものが多すぎました。
cgroupはぜひ押さえておきたいです。

参考

http://blue-9.hatenadiary.com/entry/2017/03/14/212929
http://www.usupi.org/sysad/024.html
http://man7.org/linux/man-pages/man5/proc.5.html
https://www.atmarkit.co.jp/flinux/rensai/watch2007/watch10a.html
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/resource_management_guide/sec-cpuset
https://blog.goo.ne.jp/tell14/e/d03e57fbe77a73f7991da7016824cfbf
http://manpages.ubuntu.com/manpages/bionic/ja/man5/proc.5.html
https://mjmwired.net/kernel/Documentation/filesystems/proc.txt