43時間、1分ごとにVPSを測り続けた|メモリを一番食っていたのは自分のアプリではなかった
前回の記事で、VPSのメモリを1回だけ測りました。ただしあれはアイドルに近い状態の1サンプルです。ピークは写っていません。 そこで、1分ごとに記録するスクリプトを仕掛けて放置しました。43時間、2,590サンプル、欠測ゼロ。 結果、予想は外れました。メモリのピークを作っていたのは、自分のアプリではありませんでした。 上がメモリ、下がCPUです。山が重なっていません。 これが今回いちばん面白かったところです。 測定条件 サーバー:さくらのVPS 2Gプラン / Ubuntu 24.04 LTS 期間:2026-09-04 01:10 〜 09-05 20:19(43.1時間) 間隔:1分(cron) サンプル数:2,590(120秒を超える欠測ゼロ) 載せているもの:定期的にデータを取得して予測を回すバッチ処理と、静的サイト1本 使ったスクリプト 追加パッケージは不要です。free / vmstat / ps / awk だけで動きます。 #!/usr/bin/env bash set -u OUT="${1:-$HOME/vps-metrics.csv}" if [ ! -f "$OUT" ]; then echo "timestamp,mem_total_mb,mem_used_mb,mem_available_mb,swap_used_mb,load1,load5,cpu_idle_pct,p1_name,p1_rss_mb,p2_name,p2_rss_mb,p3_name,p3_rss_mb" > "$OUT" fi ts=$(date '+%Y-%m-%d %H:%M:%S') mem=$(free -m | awk '/^Mem:/{print $2","$3","$7}') swp=$(free -m | awk '/^Swap:/{print $3}') ld=$(awk '{print $1","$2}' /proc/loadavg) idle=$(vmstat 1 2 | awk 'NR==2{for(i=1;i<=NF;i++) if($i=="id") c=i} END{print (c?$c:"")}') top=$(ps -eo comm=,rss= --sort=-rss | head -3 | tr -d ',' \ | awk '{printf "%s,%.1f,", $1, $2/1024}' | sed 's/,$//') echo "$ts,$mem,$swp,$ld,$idle,$top" >> "$OUT" cronに1行足すだけです。 ...