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


概要

こちらに経緯をまとめていますのでご覧いただければ幸いです。

proc/[pid]の中身を全部読んでみる
proc/[pid]の中身を全部読んでみる ~ attrからcpusetまで ~
proc/[pid]の中身を全部読んでみる ~ cwdからloginuidまで ~
proc/[pid]の中身を全部読んでみる ~ map_filesからnuma_mapsまで ~
間違っているよ、ここに詳しい情報が載っているよ、そのディレクトリもう使われていないよ、
など情報有ればコメントいただければ嬉しいです。

# 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

oom_adj,oom_score,oom_score_adj

# cat oom_adj
0
[root@test-sv 3792]# cat oom_score
0
[root@test-sv 3792]# cat oom_score_adj
0

LinuxカーネルにはOOM(Out Of Memory) Killerという仕組みがあり、 メモリ(RAM)が枯渇しシステムが動作不能となる恐れがある場合、 メモリリソースを多く使用しているプロセスを強制的に停止させ、メモリを確保します。
運用上重要なプロセスである場合や負荷試験時など、 OOM Killerの対象として欲しくないプロセスがある場合には、 設定を行うことで、OOM Killerの対象から外すことができます。https://users.atmark-techno.com/blog/1913/2767

oom_killer スコアを調整して、強制終了するプロセスの優先度を設定することもできます。/proc/PID/ には、oom_adj 及び oom_score という名前の付いた 2 つのツールがあります。oom_adj の有効なスコアは、-16 から +15 までの範囲内になります。現行の oom_killer スコアは、そのプロセスの oom_score で確認して下さい。oom_killer は、スコアが最も高いプロセスを最初に強制終了します。
以下の例では、PID が 12465 のプロセスの oom_score of a process を調整し、oom_killer によって強制終了される優先度を低くします。
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/s2-proc-pid

らしいです。ためになりました。

pagemap

# cat pagemap
釞 ・

pagemap ファイルは各仮想ページがどの物理ページに対応しているかを保持している特殊ファイルです.
http://mmi.hatenablog.com/entry/2017/05/01/215921

だそうです。安易にcatした途端、が点滅し始めました。怖かったです

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

こちらも読み取り専用のファイルでした。

patch_state

# cat patch_state
-1

現在あてられているパッチの状態を示しているそうです。
-1はあてられていないことを示すそうです。
...いつからいつまでの状態のことを言っているんでしょうか。不明です。

personality

# cat personality
00000000

This read-only file exposes the process's execution domain, as set by personality(2). The value is displayed in hexadecimal notation.

実行ドメインというものがあって、それが8進数で記載してあるそうです。オール0なので使われていなさそうですね。

projid_map

# cat projid_map
         0          0 4294967295

The /etc/projid file provides a mapping between numeric project identifiers
and a simple human readable name (similar relationship to the one that exists between usernames and uids).
http://man7.org/linux/man-pages/man5/projid.5.html

project - id 間のmapのようですね。
useridとusernameを結びつけるのと同じようなマッピングをしているらしい。本当か?

root

# ll
(略)
lrwxrwxrwx. 1 root root 0 Jan 12 05:09 root -> /

言わずもがなrootのパスです。chrootされていると変わるようです。

sched

 cat sched
sleep (3792, #threads: 1)
-------------------------------------------------------------------
se.exec_start                                :     318459004.030016
se.vruntime                                  :      15734302.289257
se.sum_exec_runtime                          :             1.437900
se.nr_migrations                             :                    0
nr_switches                                  :                    1
nr_voluntary_switches                        :                    1
nr_involuntary_switches                      :                    0
se.load.weight                               :                 1024
policy                                       :                    0
prio                                         :                  120
clock-delta                                  :                   51
mm->numa_scan_seq                            :                    0
numa_migrations, 0
numa_faults_memory, 0, 0, 1, 0, -1
numa_faults_memory, 1, 0, 0, 0, -1

スケジュール情報が載っているようです。
qiitaに/proc/<pid>/schedの詳細が書いてあるとてもいい記事があったのでそれを読んで勉強します。
リンクは貼っていいかわからないので貼りません。

schedstat

# cat schedstat
1437900 472415 1

一番左はschedse.sum_exec_runtime : 1.437900っぽいですが、それ以外はわかりません。

sessionid

# cat sessionid
89

プロセスはプロセスID(PID)とセッションID(SID)を持つそうで、それが書いてあるようです。

所感

英語が読めないことと、ソースコードが読めないことがつらいです。

参考

http://www.usupi.org/sysad/238.html
https://linuxjm.osdn.jp/html/LDP_man-pages/man5/proc.5.html
http://man7.org/linux/man-pages/man5/proc.5.html
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/s2-proc-pid
https://github.com/torvalds/linux/blob/master/Documentation/filesystems/proc.txt