Visual Studio CodeでのSSH接続により、EC2サーバーが高負荷になり動かなくなった

こんにちは、エンジニアの岩藤です。

今回はVisual Studio CodeでのSSH接続が原因で、接続先EC2サーバーが高負荷になってしまった現象と対策についてお話しします。

あるEC2サーバーで数人で開発していると、サーバーが急に重くなりssh接続すらできなくなる現象が定期的に発生しました。

↓topコマンドで確認した結果

top - 14:21:29 up  5:20,  1 user,  load average: 4.58, 2.01, 0.86
Tasks: 192 total,   3 running, 189 sleeping,   0 stopped,   0 zombie
%Cpu0  : 10.1 us,  3.0 sy,  0.0 ni,  0.0 id, 86.9 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  9.5 us,  2.4 sy,  0.0 ni,  0.0 id, 88.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   2016932 total,  1920156 used,    96776 free,      396 buffers
KiB Swap:  4194300 total,  1531728 used,  2662572 free.    21700 cached Mem

ただ開発しているだけなのに何故かfreeが徐々に枯渇。load averageも増えていく・・・

apache再起動、EC2サーバー再起動等で暫定対応してましたが、直ぐに高負荷状態に戻ってしまいます。

原因を調査

重たくなったタイミングで、メモリの使用状況を確認するとvscode-serveに関連したプロセスが多数

ps aux --sort -%mem 
xxxxxxx   6436  3.1  5.3 996640 107664 ?       Sl   09:54   0:03 /var/home/xxxxxxx/.vscode-server/bin/e7f30e38c5a4efafeec8ad52861eb772a9ee4dfb/node /var/home/xxxxxxx/.vscode-server/bin/e7f30e38c5a4efafeec8ad52861eb772a9ee4dfb/out/bootstrap-fork --type=extensionHost --transformURIs --useHostProxy=false
xxxxxxx   5435  2.2  3.8 941604 77360 ?        Sl   09:51   0:07 /var/home/xxxxxxx/.vscode-server/bin/e7f30e38c5a4efafeec8ad52861eb772a9ee4dfb/node /var/home/xxxxxxx/.vscode-server/bin/e7f30e38c5a4efafeec8ad52861eb772a9ee4dfb/out/server-main.js --start-server --host=127.0.0.1 --accept-server-license-terms --enable-remote-auto-shutdown --port=0 --telemetry-level all --connection-token-file /home/xxxxxxx/.vscode-server/.e7f30e38c5a4efafeec8ad52861eb772a9ee4dfb.token
xxxxxxx   6487  0.6  3.3 648460 68024 ?        Sl   09:54   0:00 /var/home/xxxxxxx/.vscode-server/bin/e7f30e38c5a4efafeec8ad52861eb772a9ee4dfb/node /var/home/xxxxxxx/.vscode-server/bin/e7f30e38c5a4efafeec8ad52861eb772a9ee4dfb/extensions/html-language-features/server/dist/node/htmlServerMain --node-ipc --clientProcessId=6436
root      1257  0.3  2.2 395728 45836 ?        SNl  09:00   0:11 /var/awslogs/bin/python /var/awslogs/bin/aws logs push --config-file /var/awslogs/etc/awslogs.conf --additional-configs-dir /var/awslogs/etc/config
xxxxxxx   6447  0.5  1.8 911756 38088 ?        Sl   09:54   0:00 /var/home/xxxxxxx/.vscode-server/bin/e7f30e38c5a4efafeec8ad52861eb772a9ee4dfb/node /var/home/xxxxxxx/.vscode-server/bin/e7f30e38c5a4efafeec8ad52861eb772a9ee4dfb/out/bootstrap-fork --type=fileWatcher
xxxxxxx   5517  0.2  1.6 786408 32952 ?        Sl   09:51   0:00 /var/home/xxxxxxx/.vscode-server/bin/e7f30e38c5a4efafeec8ad52861eb772a9ee4dfb/node /var/home/xxxxxxx/.vscode-server/bin/e7f30e38c5a4efafeec8ad52861eb772a9ee4dfb/out/bootstrap-fork --type=ptyHost --logsPath /home/xxxxxxx/.vscode-server/data/logs/20220926T095115

上記のプロセスのxxxxxxxさんに確認したところ、Visual Studio Code(vscode)というツールからssh接続して開発を行っていました。どうやら、その時に立ち上がるプロセスがメモリを大量に消費しているようです。

ググったところ同じ原因と思われる記事がいくつか・・・

読み漁ったところ vscodeエディタでssh接続すると、サーバー上のファイルとローカルファイルのgit差分を監視してくれていて、それにより大量のメモリを消費してるとのこと。(この監視で、サーバー上のファイルと、ローカルのファイルで同期を取ってくれている)

なるほど・・・

本当にvscodeが原因なのかを確認

全ファイルの監視をやめてみる

code > 基本設定 > 設定

↓下記の画面が開く

↓Watcher excludeと検索。該当サーバーにだけ反映したいので、該当サーバーのタグを選択

ここで、監視対象からファイルを除外する事ができます。

↓全部除外するために パターンを追加を押して、**を追加。vscodeを再起動

これで、ファイル監視が外された状態になりました。

この後暫くし様子見しましたが、重たくなる現象が発生しなくなりました。やはりvscodeでの接続が原因だったようです。

top - 12:55:26 up  3:54,  2 users,  load average: 0.08, 0.11, 0.12
Tasks: 178 total,   1 running, 177 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   2016932 total,  1931700 used,    85232 free,    16112 buffers
KiB Swap:  4194300 total,   310148 used,  3884152 free.    57592 cached Mem

※ちなみに、他のサーバーでもvscodeを使っているのに、このサーバーだけ何故高負荷になるのかという疑問もあったんですが、それは監視されるファイル数が起因していると考えられます。

一部のディレクトリだけ監視対象から外す

全ファイル監視が行われなくなると、通常なら保存(command + s)だけで反映される筈がリロードボタンを押す必要が出てきます。

これは面倒です。

なので、ファイル監視が不要なディレクトリだけを監視リストから除外する事にしました。

↓Watcher excludeから**を消して、vendor等の監視する必要がないディレクトリを追加して再起動

しばらく様子見しましたが、負荷は大丈夫そうです。

top - 15:32:21 up  6:31,  2 users,  load average: 0.00, 0.01, 0.05
Tasks: 171 total,   2 running, 169 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   2016932 total,  1913688 used,   103244 free,    30348 buffers
KiB Swap:  4194300 total,   250652 used,  3943648 free.    55948 cached Mem

これで、今まで通り保存するだけで反映されるようになりました!

・・・と思ったら、たまに再発。確認したらサーバーに不要なgitブランチ&シムリンクがいくつかありそれを消したら落ちつきました。 不要なものは消して、除外リストを精査する事で安定性を保てそうです。