見出し画像

[サーバー負荷が上がりピンチ!] CPU使用率が高いプロセスや、メモリを大量に消費しているプロセスについてChatGPTに教えてもらう(topコマンド)

今回は、CPU使用率が高いプロセスや、メモリを大量に消費しているプロセスについてChatGPTに教えてもらおうと思います!

1.なぜ、サーバー負荷チェックについて教えてもらおうとしたか?

以下の通り。

1-1.画像を超解像にしたい

画像から文字を抽出する際に読み取り精度を上げたく、ESRGANという、画像を超解像にする機能があるとのことで、さっそく使おうと思った!

1-2.学習済みモデルをGoogle Driveからwgetができず

ESRGANを使用する際には、学習済みモデルをGoogle Driveからダウンロードせよ。とのことでサーバー上に配備しようと試みるが、Google Driveからwgetが上手くできず。

1-3.WEBからアップロードする機能を作ってしまえ

ローカルにダウンロードしてsftpで配置で良いのですが、WEBからアップロードする機能を作ってしまえ!とのことで早速ChatGPTで作ることに。

1-4.ウイルスチェックも搭載する

アップロード機能を作るなら、ウイルスチェックも搭載しよう!ということで、やり方をChatGPTに聞く

ウイルスチェックファイルのアップロード時にウイルスチェックを行うことで、セキュリティを強化することができます。Djangoでのウイルスチェックの方法についていくつかのアプローチを紹介します:
ClamAVを利用する:ClamAVはオープンソースのウイルススキャナーで、Djangoアプリケーションに統合することができます。

1-5.ClamAVを使ったら、サーバーの負荷が急激に上がりピンチ!

ClamAVを使ったら、サーバーが高負荷状態となり、SSHもほぼ動かなくなりピンチ!どうしよう!!

1-6.サーバーのCPU使用率やメモリ使用量の調査の仕方をChatGPTに教えてもらう!

というわけで、サーバーのCPU使用率が高いプロセスや、メモリを大量に消費しているプロセスをChatGPTに教えてもらうことにしました。
(早くなんとかしてくれ!)

2.ChatGPTにサーバーの負荷のチェックについて教えてもらう

少々焦りながら、ChatGPTにtopコマンドについて聞きました。
topコマンドは使用したことがありますが、ガチで負荷が高い時には使用したことがなかったので、今回は身をもって勉強できそうです!

2-1.topコマンドについて、CPU使用率が高いプロセスや、メモリを大量に消費しているプロセスについての見方

top コマンドは、システムのパフォーマンスをリアルタイムで監視するための強力なツールです。以下に、top コマンドの出力を理解し、CPU使用率が高いプロセスやメモリを大量に消費しているプロセスを特定する方法を説明します。

コマンドの基本的な使い方コマンドの実行:

画面の見方:
概要情報: 画面の上部にはシステムの概要情報が表示されます。
uptime: システムが動作している時間。
ユーザー数: 現在ログインしているユーザーの数。
ロードアベレージ: 1分、5分、15分の平均負荷。
タスク情報:
Tasks: 現在のプロセスの総数、実行中のプロセスの数、スリープ中のプロセスの数、停止中のプロセスの数、ゾンビプロセスの数。
CPU情報:
%Cpu(s): CPUの使用率。ユーザー時間、システム時間、アイドル時間などが表示されます。
メモリ情報:
Mem: 使用中の物理メモリ、空きメモリ、バッファ、キャッシュなど。
Swap: 使用中のスワップメモリ、空きスワップメモリ。
プロセス情報:
画面の下部には、各プロセスの詳細が表示されます。主な列は以下の通りです。
PID: プロセスID。
USER: プロセスを実行しているユーザー。
PR: プロセスの優先度。
NI: ナイス値(優先度の調整値)。
VIRT: 仮想メモリサイズ。
RES: 常駐メモリサイズ(実際に物理メモリに存在する部分)。
SHR: 共有メモリサイズ。
S: プロセスの状態(R=実行中、S=スリープ、D=不可侵スリープ、Z=ゾンビ)。
%CPU: CPU使用率。
%MEM: メモリ使用率。
TIME+: CPU時間の累計。
COMMAND: 実行コマンド。

CPU使用率が高いプロセスの特定ソート: top コマンド実行中に P キーを押すと、CPU使用率でプロセスをソートできます。CPU使用率が高いプロセスが上位に表示されます。

メモリ使用量が多いプロセスの特定ソート: top コマンド実行中に M キーを押すと、メモリ使用率でプロセスをソートできます。メモリ使用率が高いプロセスが上位に表示されます。

具体的な手順
top コマンドを実行:

CPU使用率が高いプロセスを確認:
P キーを押してCPU使用率でソートします。
上位に表示されたプロセスが高いCPU使用率を示しています。
メモリ使用量が多いプロセスを確認:
M キーを押してメモリ使用率でソートします。
上位に表示されたプロセスが高いメモリ使用率を示しています。



以下は、top コマンドの出力例です。

top - 15:30:21 up 1 day,  3:45,  2 users,  load average: 0.02, 0.03, 0.00
Tasks: 104 total,   1 running, 103 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.0 us,  0.5 sy,  0.0 ni, 98.0 id,  0.5 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  4037164 total,  1520280 free,  1203988 used,  1312896 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  2545972 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 1234 root      20   0  274520  37228   8168 S   1.0  0.9   0:12.34 myprocess
 5678 user      20   0  107640   4148   2900 S   0.5  0.1   0:03.21 anotherproc

この例では、myprocess が最も多くのCPUを使用しており、anotherproc がその次に続いています。メモリ使用量の観点からは、myprocess が相対的に多くのメモリを消費していることがわかります。

これらの情報を基に、システムの負荷を引き起こしているプロセスを特定し、必要に応じて対応策を講じることができます。

2-2.kswapd0とは?

kswapd0のCPU使用率が100%となっている。。

kswapd0 は、Linuxカーネルがメモリ管理とスワップの処理を行うためのバックグラウンドプロセスです。主に次の2つの役割を果たします。
メモリ管理: kswapd0 は、システムのメモリ管理を監視し、必要に応じてメモリのページをスワップ領域に移動させることで、物理メモリの効率的な利用をサポートします。物理メモリ(RAM)が不足している場合、カーネルはメモリを解放するためにスワップアウト(スワップ領域にページを移動すること)を実行し、その処理は kswapd0 によって管理されます。
スワップ処理: スワップ処理は、物理メモリが不足する場合に使用されます。メモリの一部をディスク上のスワップ領域に移動させ、より多くのメモリを必要とするプロセスが実行できるようにします。kswapd0 は、このスワップ処理を管理し、必要に応じてスワップイン(スワップ領域からページをメモリに移動すること)やスワップアウトを行います。


kswapd0 は、システムの負荷が低いときにはほとんど活動しないことが一般的ですが、メモリが不足してスワップが頻繁に発生すると、このプロセスがCPUリソースを消費することがあります。通常、このような場合にはシステムのメモリ設定や負荷を見直し、メモリを適切に管理することで、kswapd0 の負荷を軽減することが望まれます。

2-3.'kswapd0'のCPU使用率が高いので、解消したい

kswapd0 プロセスのCPU使用率が高い場合、これはメモリのスワップ処理が頻繁に行われていることを示しています。スワップ処理は、システムが物理メモリ(RAM)の不足に対処するために、メモリページをディスクに移動する操作です。これが頻繁に発生する場合、システムのパフォーマンスが低下します。以下の手順でこの問題を解決する方法を検討できます。

1. メモリ使用状況の確認

まず、システムのメモリ使用状況を確認します。

free -m
              total        used        free      shared  buff/cache   available
Mem:           7982        6792         155         132        1035         752
Swap:          2047         512        1535

ここで、used メモリが多く、available メモリが少ない場合、メモリが不足している可能性があります。

2. スワップ使用量の確認

スワップの使用量を確認します。スワップが多く使われている場合、スワップの頻繁な使用が kswapd0 の高いCPU使用率の原因である可能性があります。

swapon -s
Filename                                Type            Size    Used    Priority
/dev/sda1                               partition       2047996 512     -2

3. メモリを大量に消費しているプロセスの特定

メモリを大量に消費しているプロセスを特定します。

top -o %MEM

または htop コマンドを使用して、視覚的に確認できます。

4. 不要なプロセスの終了

不要なプロセスがメモリを消費している場合、それらを終了させてメモリを解放します。

kill -9 <PID>

5. メモリのリークの確認

メモリリークが原因である場合、アプリケーションの再起動や、メモリリークの修正が必要です。具体的には、アプリケーションのログやデバッグツールを使用して、メモリリークの原因を特定します。

6. スワップの設定変更

スワップの利用頻度を下げるために、swappiness パラメータを調整します。デフォルトではこの値は 60 に設定されていますが、これを下げるとスワップの使用頻度が減ります。

現在の設定値の確認:
cat /proc/sys/vm/swappiness

一時的な変更(次の再起動まで有効):
sudo sysctl vm.swappiness=10

永続的な変更(再起動後も有効):
sudo nano /etc/sysctl.conf

以下の行を追加または変更します:
vm.swappiness=10

7. メモリの増設

物理的に可能であれば、サーバーのRAMを増設することが最も効果的な解決策です。これにより、スワップの使用が減少し、kswapd0 プロセスの負荷も軽減されます。

8. キャッシュのクリア

システムキャッシュが過剰にメモリを消費している場合、キャッシュをクリアすることでメモリを解放することもできます。ただし、この操作は慎重に行う必要があります。

キャッシュのクリア:

sudo sync; echo 3 | sudo tee /proc/sys/vm/drop_caches

以上の手順を試して、kswapd0 のCPU使用率を低下させ、システムのパフォーマンスを改善してください。問題が解決しない場合、システムの構成やアプリケーションの見直しも検討する必要があります。

3.負荷終息後、再び新手の負荷か!?

ClamAVのデーモン(clamd)のメモリ使用率が80%で、これがサーバー負荷の原因なので、killコマンドで停止しようとしたのですが停止せず、lightsailの管理画面からインスタンスを停止、開始を数回実施したところ、負荷が落ち着き無事正常な状態に戻りました。。焦った焦った。

その後、ESRGANを使用する際の学習済みモデルをサーバーに配置し、「超解像!」してみたところ、これもサーバー負荷が高まったので急遽ロジックを消すことに。。

4.そういえば、推奨スペックを調べてなかったので、ChatGPTに聞く

「聞くのが遅い!」
最初に調べるべきでしたが、推奨スペックをChatGTPに聞くことに!

ESRGANの推奨スペック(一部抜粋)

3. メモリ (RAM)
推奨RAM: 少なくとも16GB以上
用途: 大きなデータセットや高解像度の画像を処理する場合、より多くのメモリが必要です。32GB以上が理想的です。

ClamAVの推奨スペック(一部抜粋)

2. サーバー用途(中規模)

企業内サーバーや複数ユーザーが利用する中規模環境向けの推奨スペックです。CPU: 4コアのプロセッサ(例: Intel Xeon E3または同等)
メモリ: 4GB - 8GB
ストレージ: 20GBの空き容量
OS: Linux(最新のLTSバージョンを推奨)

使用しているサーバースペックは?

ぜんぜん足りてない!!
Lightsail 1GB!

よくよく考えると画像処理や動画編集などをする際に使用するマシンスペックは、16GB以上ないと厳しいですよね〜。

おわりに

最後まで読んで頂きありがとうございます!

作業中、SSHが相当重くなり、CPU使用率が100%になった時は焦りましたが、それがきっかけでtopコマンドを整理することができたのは良かったです。

「そのうちtopコマンドを整理する!」と、かなり奥の方に眠っていたTODOリストがありましたが、やっとFIXすることができました!
(優先度が高くないTODOリストは基本的に放置されてしまいますね〜)






この記事が気に入ったらサポートをしてみませんか?