インフラ保守・運用を行う上で重要な負荷に関する話題です。こちら では CPU について触れましたが、今回はメモリについて考えます。
メモリは こちら でも記載した通り「CPU レジスタ > メモリ > ハードディスク」とハードディスクよりも高速です(具体的な数値は複雑になる為触れません)。
SSD 等が話題になりハードディスクも高速になりつつありますが、未だメモリ=主記憶装置、ハードディスク=補助記憶装置と位置づけられている通り愕然とした性能差が存在します。
一方でメモリの短所は
- 容量が(ハードディスクに比べて)少ない
- 記憶し続けるには電気が必要
とハードディスクにない特性も持っています。容量が少なく物理メモリ以上にメモリを必要とする場合、スワップアウトが発生します。
スワップアウトは結果的にハードディスクへの書き込みになる為、この間メモリの速度はハードディスクと同じになってしまいます(つまり遅い)。
忘れがちなメモリへの制限
32Gbyte 級の多大メモリを積んでいない限りメモリの利用量もある程度意識する必要が出てくるでしょう。例えば業務ツールを実行した時に「いきなりツールが使用するメモリが 2Gbyte(32bit の限界)まで膨らんでしまった」というのもよく出くわします。
これはプログラム内でファイルサイズを意識した設計になっていない状態で読み込むファイルが数 Gbyte の場合等に発生します。
通常のプログラム言語ではファイル読み込み時に読み込みサイズを指定することができます。例えば python の場合以下のようになります。
#! /usr/bin/python
# -*- coding:utf8 -*-
import sys
import time
import os
def main() :
# test.txt を読み込む
fd = open("test.txt" , "r")
# test.txt の読み込みが最後になるまでループ
while fd.tell() < os.path.getsize("test.txt") :
# 1Mbyte だけ読み込み
for _lines in fd.readlines(1 * 1024 * 1024) :
_lines = _lines.rstrip("n")
print _lines
# ついでに CPU 負荷もちょっとだけ考慮
time.sleep(0.005)
if __name__ == "__main__" :
main()
sys.exit(0)
このような意識を持つだけでも適切なリソース制御ができるようになるでしょう。