ラズパイで Go 製のツールを ps で見たときに大量のメモリを使ってるように見えてもびっくりしないで

はじめに

この記事は Qiita Advent Calendar 2025 "Go シリーズ 1" の14日目の記事です。

本文

github.com

Go製の FTPサーバーに fclairamb/ftpserver というのがあります。私はよくお世話になっているのですが、以下のイシューが上がっていました。

github.com

内容は「このツールを arm64 の環境で実行したらメモリ1GBも使ってるけどなんで?」って内容。

私がすでに回答していますが、この件、すでに Go の公式の FAQに乗っているくらい有名なことのようです。

go.dev

ザックリいうと、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 を見てびっくりしないようにしよう!

メモリ使用量を見たいときは RSSRES を確認しよう!