LoginSignup
21
20

More than 5 years have passed since last update.

Linuxプロセスのメモリ共有率を計算する

Posted at

LinuxプロセスのCopy on Writeによるメモリ共有率を計算するプログラム。

こちらのエントリーと

上記エントリー内で参照されている

を参考にして、紹介されている Linux::Smaps モジュールを利用したPerlのプログラムをPythonで書いてみました。外部モジュールのインストールなしで動作するので使いやすいかと思います。Python 2.6系以上で動作することを確認しています。

#!/usr/bin/env python

import sys

def read_smaps(pidlist):
    try:
        print("PID\tRSS\tSHARED\t\tNONE_SHARED")
        mem = lambda t, f: int(f[1]) if f[0] == '%s:' % t else 0.0
        for pid in pidlist:
            filename = "/proc/%s/smaps" % pid
            with open(filename) as f:
                rss = 0.0
                shared = 0.0
                for line in f:
                    fields = line.split()
                    rss += mem('Rss', fields)
                    shared += mem('Shared_Clean', fields)
                    shared += mem('Shared_Dirty', fields)
                print("%s\t%d\t%d (%.2f%%)\t%d" %
                      (pid, rss, shared, shared/rss*100, rss - shared))

    except IOError as e:
        print(e)

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print("usage: %s [pids]" % __file__)
        sys.exit(-1)

    read_smaps(sys.argv[1:])

  • 使用例
$ sudo ./read_smaps.py
usage: ./read_smap.py [pids]

## PIDのリストをpgrepコマンドで指定して、プログラムのメモリ使用量(共有率)を計算する
$ sudo ./read_smaps.py `pgrep train_model.py`
PID     RSS     SHARED          NONE_SHARED
23241   330396  202516 (61.29%) 127880
23246   414720  202476 (48.82%) 212244
23247   414836  202480 (48.81%) 212356
23248   414196  202440 (48.88%) 211756

RSSがプロセスのメモリ使用量、SHAREDが共有されているメモリ使用量(共有率)、NONE_SHAREDが共有されていないメモリ使用量を表しています。上記の例はPython(using scikit-learn)で書いたマルチプロセスで回帰の学習と交差検証を行うプログラムのメモリ共有率を調べたものですが、だいたい50%前後のメモリを共有していることが読み取れます。

/proc/{PID}/smaps ファイルの中身を読むだけの簡単なプログラムなので、AWKで書いている方もWeb上にたくさんいらっしゃるようです。仕事柄、データサイエンスや要素技術系はPythonで書くことが多いので、ここでも多少使い慣れているPythonで書きました。最近はこっそりGo言語の勉強して、書き捨てのコードは業務でもGoで書いたりしてますけども。

21
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
20