こんにちは、エンジニアの岩藤です。
今回は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ブランチ&シムリンクがいくつかありそれを消したら落ちつきました。 不要なものは消して、除外リストを精査する事で安定性を保てそうです。