LinuxはLoadが高すぎる問題をチェックします


ケース1:CPU高、Load高

  • topコマンドによりCPUを最も占有するプロセスPIDを検索する.
  • top-HP PIDによってCPUの最も高いスレッドTIDを検索する.
  • javaプログラムについて、jstackを使用してスレッドスタック情報を印刷する.
  • printf%x tidによりCPUスレッドを最も消費する16進数を印刷する.
  • は、スレッドのスタック情報をスタック情報に表示する.

  • ケース2:CPU低、Load高

  • topコマンドによりCPU待機IO時間、すなわち%waを表示する.
  • iostat-d-x-m 1 10でディスクIOの状況を表示します.(インストールコマンドyum install-y sysstat)
  • sar-n DEV 1 10を介してネットワークIOの状況を表示する.
  • は、IOを占有するプログラムを次のコマンドで検索する.
  • ps -e -L h o state,cmd  | awk '{if($1=="R"||$1=="D"){print $0}}' | sort | uniq -c | sort -k 1nr
    sar 5 6   //  5s   6    

     
    16 13 01      CPU     %user     %nice   %system   %iowait    %steal     %idle
    16 13 06      all      9.15      0.00     48.19      0.05      0.00     42.61
    16 13 11      all      2.13      0.00      8.76      0.08      0.00     89.03
    16 13 16      all      2.13      0.00     11.41      0.03      0.00     86.44
    16 13 21      all      2.20      0.00     10.61      0.05      0.00     87.14
    16 13 26      all      2.48      0.00     10.44      0.08      0.00     87.00
    16 13 31      all      2.40      0.00     10.51      0.05      0.00     87.00
    

    注意:
    CPU:allは、統計情報がすべてのCPUの平均値であることを示します.
    %user:ユーザー・レベルでCPUを使用して実行した合計時間の割合を表示します.
    %nice:ユーザー・レベルで表示され、nice操作に使用されるCPUの合計時間のパーセントです.
    %system:コアレベル(kernel)で実行するCPUの合計時間の割合.
    %iowait:I/O操作待ちのCPU総時間の割合を表示します.
    %steal:マネージャ(hypervisor)が別の仮想プロセスにサービスを提供し、仮想CPUを待つ割合.
    %idle:CPUアイドル時間がCPU総時間に占める割合を表示します.

    インスタンスの照合


    一、vmstatオプション
    -aアクティブメモリ(active)と非アクティブメモリ(inact)-fシステム起動から現在までのfork数を表示-m表示slabinfo-s静的表示メモリ関連情報まずデフォルトコマンドを実行し、出力結果に基づいて各フィールドの意味を説明し、以下の分析に役立つ.
    [root@master ~]# vmstat 
    procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
     1  0      0 431340  44840 211744    0    0     5     2  149    9  2  4 95  0  0    
    
    [root@minion ~]# vmstat -a
    procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
     r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
     1  0      0 757496  64916  83772    0    0    85     7   56   42  1  3 96  0  0    

    各フィールドに対応する項目の意味は次のprocsです.
    -r実行待ちのプロセス数-b uninterruptible睡眠中のプロセス数memory
    -swpdが使用するswap空間-free残りの物理メモリ-buff buffer-cache cache-inact非アクティブな内部数(-aオプション)-activeアクティブなメモリの数(-aオプション)swap-siディスクから交換されるメモリサイズ-soディスクに交換されるメモリサイズ
    io
    -biがブロック装置から受信ブロック(block/s)-boがブロック装置に送信ブロック(block/s).この値が長期にわたって0でない場合は、キャッシュに使用されていないためメモリに問題がある可能性があります(もちろん、直接I/Oの場合は排除されませんが、一般的に直接I/Oの場合はめったにありません)system
    -inクロック割り込みを含む毎秒の割り込み回数-csプロセスコンテキスト切替回数cpu
    -usユーザプロセス占有CPU時間比例-syシステム占有CPU時間比例-id CPUアイドル時間比-wa IO待ち時間比(IO待ちが高い場合、ディスク性能に問題がある可能性がある)-st steal time 2、CPU編2.1モニタ指標CPU利用率.経験的に見ると、ユーザ空間プロセスがCPUを占有する割合は65〜70%であり、カーネル(システム)CPUの割合は30%〜35%であり、空き割合は0%〜5%である.一般的にこの割合を超えてはいけません.この割合を超えると、システムの性能が低下し、平均負荷が上昇します.これは次のテストで見られます.プロセスコンテキストの切り替えコンテキスト切替はCPU利用率と結びつけるべきであり、CPU利用率が低い場合は、コンテキスト切替がやや高くても許容できる.コンテキスト切替もCPUリソースを消費する必要があり、頻繁な切替はCPU利用率を上昇させるに違いない.実行キューの実行待ちプロセスの数.各CPUコアにおける処理待ちのプロセス数は、3スレッド/プロセスを超えてはならない.4コアのマシンの場合、キューの最大値は12個を超えないはずです.平均負荷平均負荷値は、コアCPUあたりの負荷を平均0.7に制御すること.1を超えないほうがいい.
    一般的に、私はtopコマンドとvmstatコマンドを使って一緒に見ています.topコマンドは全体的な状況を見ることができます.タスクごとにリソースを消費する状況も見ることができます.vmstatコマンドを使用して、キュー内のタスクリスト、プロセスコンテキストの切り替えを表示します.
    次に、マルチスレッド(20スレッド)を用いてグローバル変数+1をループするCPU密集型プログラムを示す.このプログラムは以下の通りです.
    #!/usr/bin/python
    
    import threading
    
    count = 0
    
    class Test(threading.Thread):
        def __init__(self):
            threading.Thread.__init__(self)
    
        def run(self):
            global count
            for i in xrange(1,100000000):    #100000000
                count += 1
            print count
    if __name__ == '__main__':
        threads = []
        for i in range(10):
            thread = Test()
            threads.append(thread)
            thread.start()
        for thread in threads:
            thread.join()
        print count

    2.2プログラム実行前にtopコマンドとvmstatコマンドを使用して関連レポートを表示する
    vmstatレポート
    [root@master ~]# vmstat 2 10
    procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
     0  0      0 432696  43672 211724    0    0     6     2  148  715  2  4 94  0  0    
     0  0      0 432688  43672 211724    0    0     0     0   20   17  0  0 100  0  0   
     0  0      0 432688  43672 211724    0    0     0     0   16   17  0  0 100  0  0   
     0  0      0 432432  43672 211724    0    0     0     0   54   43  0  1 99  0  0    
     0  0      0 432400  43672 211724    0    0     0     0   38   37  0  0 100  0  0   
     0  0      0 432376  43672 211724    0    0     0     0   88   65  0  1 99  0  0    
     0  0      0 432120  43672 211724    0    0     0     0   49   35  0  1 99  0  0    
     0  0      0 432152  43672 211724    0    0     0     0   31   28  0  0 99  0  0    
     0  0      0 432152  43672 211724    0    0     0     0   29   26  0  0 100  0  0   
     0  0      0 432152  43672 211724    0    0     0     0   15   16  0  0 100  0  0   

    トップレポート
    [root@master ~]# top
    top - 12:11:37 up  7:07,  3 users,  load average: 0.00, 0.00, 0.02
    Tasks: 114 total,   1 running, 113 sleeping,   0 stopped,   0 zombie
    Cpu0  :  1.8%us,  3.3%sy,  0.0%ni, 94.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Cpu1  :  1.3%us,  3.8%sy,  0.0%ni, 94.8%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st
    Mem:   1004412k total,   573856k used,   430556k free,    45160k buffers
    Swap:  2047992k total,        0k used,  2047992k free,   211748k cached

    トップレポートとvmstatレポートによれば、システムのパフォーマンスが良好であるという結論を下すことができます.各指標の値は高くないので
    2.3プログラム実行時vmstatレポート
    [root@master ~]# vmstat 2 10
    procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
    21  0      0 423072  43640 211724    0    0     6     2  142  506  2  4 95  0  0    
    20  0      0 423064  43640 211724    0    0     0     0 2085 78125 26 73  1  0  0   
    20  0      0 423064  43640 211724    0    0     0     0 2038 79752 24 74  1  0  0   
    20  0      0 423064  43640 211724    0    0     0     0 2057 78022 25 74  1  0  0   
    20  0      0 423064  43640 211724    0    0     0     0 2045 85145 25 73  2  0  0   
    20  0      0 423032  43640 211724    0    0     0    12 2002 68602 25 73  2  0  0   
    20  0      0 422908  43640 211724    0    0     0     0 2065 79101 25 73  1  0  0   
    20  0      0 422908  43640 211724    0    0     0     0 2048 78424 26 73  1  0  0   
    10  0      0 422940  43640 211724    0    0     0     0 2039 69779 22 76  2  0  0   
    21  0      0 422940  43640 211724    0    0     0     0 2050 81712 26 73  2  0  0   

    トップレポート
    [root@master ~]# top
    top - 10:55:10 up  5:51,  3 users,  load average: 15.01, 11.58, 6.21
    Tasks: 115 total,   1 running, 114 sleeping,   0 stopped,   0 zombie
    Cpu0  : 27.8%us, 72.2%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Cpu1  : 22.2%us, 77.8%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:   1004412k total,   581836k used,   422576k free,    43656k buffers
    Swap:  2047992k total,        0k used,  2047992k free,   211724k cached

    運行時の状況は非常に悪いように見えます.私はこのいくつかの値に重点を置いています:top報告分析-load average:15.01,11.58,6.21-%sys:いずれも70%以上に達しています-id%は0です
    vmstatレポート解析-r実行キューで待機するスレッド/プロセスは基本的に20程度-csコンテキスト切替毎秒80000回程度
    上記の解析から,システム系エネルギーはすでに劣っていることが分かった.ここでは、なぜシステムがCPUの利用率を占めているのかを分析してみます.プロセス/スレッドのスケジューラ室はカーネルサブシステムのプロセススケジューラによってスケジューラされているため、頻繁な切替はプロセススケジューラも非常に頻繁にCPUを占有していることを示しているので、システムがCPUを占有する時間が高いと思います.また、システム呼び出しにも時間がかかります.従って、システムがCPUを占有する割合は高く、ユーザ空間プロセスがCPUを占有する割合は相対的に低い.システムはユーザーにサービスを提供し、ほとんどのリソースがシステムに占有されている場合、このユーザーはどんな仕事をすることができますか?
    補足topフィールドの意味:
    %hi , IRQ.この値が不均衡の場合は、割り込み等化が設定されていないことを示します.設定方法は、以前の記事のマルチキューNIC割り込み等化を参照してください.
    -%si soft IRQ、すなわちソフトブレーク-PR優先度-NI nice値-VIRT virtual image(kb)-RES Resident size.使用されている非swap物理メモリ-SHR共有メモリサイズ(kb)-%CPUの合計CPU時間に対する割合.この値は、前回更新したCPU使用率と同じです.トップコマンドが3秒ごとにデータを更新する場合、この値はこの3秒以内のCPU使用率-%MEMタスク

    関連ツールの使用方法:


    sar用法詳細:Linuxのsarコマンド詳細
    iostat使用法詳細:Linux IOリアルタイムモニタiostatコマンド詳細
    vmstat用法详细解:Linux vmstat命令実戦详细解