はじめに
この記事は Qiita Advent Calendar 2025 "Go シリーズ 1" の14日目の記事です。
本文
Go製の FTPサーバーに fclairamb/ftpserver というのがあります。私はよくお世話になっているのですが、以下のイシューが上がっていました。
内容は「このツールを arm64 の環境で実行したらメモリ1GBも使ってるけどなんで?」って内容。
私がすでに回答していますが、この件、すでに Go の公式の FAQに乗っているくらい有名なことのようです。
ザックリいうと、Go は仮想メモリ領域をはじめにガッツリ予約領域として確保しているみたいなんです。その仮想メモリの領域が ps とかで見たときにでかい領域を確保しているように見えてしまいます。
ただ、ps のメモリ表示には二種類あって、VSZ が 予約領域サイズで、実メモリサイズは RSS の値になります。なので、実メモリサイズを見たい場合は RSS を見るのがよさそうです。
シンプルなプログラムで実験
単純に入力待ちをするプログラムを C言語と Go言語で書いてみました。環境はラズパイではなく Ubuntu (Intel Core i7) ですが、この現象はラズパイのみの現象ではないので Ubuntu でも再現できます。
以下 C言語のプログラム
#include <stdio.h> int main(void) { int v; scanf("%d", &v); }
以下 Go言語のプログラム
package main import "fmt" func main() { var v int fmt.Scanf("%d", &v) }
実行結果
$ ps aux | head -n 1; ps aux | grep virmemcheck | grep -v grep USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND bamchoh 11130 0.0 0.0 2684 1368 pts/2 S+ 20:22 0:00 ./c-virmemcheck bamchoh 11134 0.0 0.0 1225436 1820 pts/0 Sl+ 20:23 0:00 ./go-virmemcheck
確かに、VSZ(仮想メモリ領域) がかなり大きくなっているのがわかります。ただ、RSS(実メモリサイズ)はさほど変わらないこともわかりますね。
まとめ
Go製のツールを ps で見るときは VSZ を見てびっくりしないようにしよう!
メモリ使用量を見たいときは RSS か RES を確認しよう!