診断システムを作るために、医学的治療を与えるように、様々なニーズ現象に応じて、沸騰し、可能なオプションの最終的な選択を可能なすべてを削除し、視点を発揮することが確認、理由を決定、原因を修正します。目に見える、診断が研究への容易なものを含む、人の総合力されていないかどうか、知識の強固な基盤、豊富な実務経験かどうか。システム障害の根本原因を診断し、患者を治すことができ、これは神の偉大な唯一の手段です。
時間のオタクは、包括的な説明をしたが、著者が実際にすばらしい意味し、スペアなしの練習がない場合にのみ見られ、Linuxでシステムを診断する方法として、「Linuxのパフォーマンスチューニング」を学び、あることを忘れがちです診断マップとして使用する手動dapperの少しの命令を期待。記事、ちょうどこの領域でのニーズを満たすために:時間に毎日レッスンでオタク「?360度の肖像診断アプリケーションシステムを行うどのくらいの速」を参照してくださいするには(部門シニア・アーキテクトのFengzhongフラグJingdongは数著者)この時間、フック、乾燥品の完全な、私の記事は、このビデオの統合と拡張したものです。角度は、この記事の焦点を把握し、我々は可能な限りすべてをカバーすることはできません。すべての詳細が明確に言うならば、あなたは全体のコンテキストが表示されないことがあります。
なぜべき診断
オンライン・システムのパフォーマンスは、突然、CPUに遭遇したjumpedが後に診断が通常が発生、メモリが使い果たされ、データベース接続プールが枯渇し、スレッドのデッドロック、最終的にシステムのパフォーマンスに影響を与えるこれらの問題をスワップ頻繁ページ、システム・スループットと応答時間を含みます。あなたは数静脈に伝統的な中国医学の古いシステムを必要とするときです。
2を診断する方法
今、大規模システムのいくつかは、Linuxシステム上のLinuxシステム上で動作のほとんどは、すべてのアプリケーションはプロセスであり、Linux上で、Linuxのオペレーティング・システム・レベルで何かがファイルとして保存され、プロセスは、例外ではありませんそのため、Linux上で私たちの診断の目的は、プロセスとスレッドです。
2.1 PROC見ます
Linuxでの保管の過程で見てみましょうが、必要性は/ procディレクトリは、ディレクトリが実際に外の世界への輸出情報にカーネルが使用するファイルシステムによって作成されたソフトウェアの特別な種類であるに焦点を当てるために、専用のメモリがあり、外を取ることはありませんメモリ空間。
nginxのは、Linuxでの例を参照するためのプロセスを見つけます:
#系统程序名
/proc/$pid/exe
#启动命令行
/proc/$pid/cmdline
#环境变量
/proc/$pid/environ
#操作文件或网络连接[inode],可以到/proc/net/tcp里面对应
/proc/$pid/fd
#内存映射,这个有些特殊情况下非常有用,比如占用内存过大分析
cat /proc/$pid/maps
#查看线程的堆栈信息,很有用
cat /proc/$pid/task/$taskId/stack
2.2 CPU
そうでない場合には、スループット、または応答を含む、システムパフォーマンス、CPU使用率、CPU使用率は、システムがビジー状態でないと計算がビジーIOとすることができることを示す、高くない場合、ガオBugaoを参照します。一般的なIOとCPU使用逆だされ、CPU時間ハイに、システムがビジー状態計算であることを示し、次いで、IOこのシステムは比較的低くある必要があり、一般的にはCPUを可能にするようにしている時間の間IO、IOシステムより高い場合A。
ディスクIO、IOドライバ(これが現在理解していない見ていない)、メモリページング率、ネットワークIO:IOに焦点を当てる必要があります。
CPUは、メモリ、IOは、ネットワーク帯域幅が高く、システムの性能は依然として問題であるれていない場合、それはインタフェースが返すことができる待って、待っているロックCPU等のシステムによってブロックされていてもよい、コンテキストスイッチがある、等を発生している可能性があり。
CPUリソースの競合が頻繁にコンテキストスイッチで、その結果、パフォーマンスの問題、主ロック競合、ロックバンドにつながる、CPU使用率は、高性能CPUコアの状態です。
2.3高速キャッシュメモリディスクの比較
L1 L2 CPU及びメモリ速度のコントラスト:
からイメージ:https://manybutfinite.com/post/what-your-computer-does-while-you-wait/
図形記述、L1キャッシュ、すなわち、遅延が1nsの3つのクロック分程度でありますサイクル、14 4.7ns約クロックサイクルであるL2キャッシュは、メモリアクセスが83ns、すなわち、250クロックサイクル程度です。
図の物品興味深い例がある:クロック周期が1秒である場合、データは紙のシートとしてL1キャッシュから読み出され、L2キャッシュが近傍から棚で、テーブル(3秒)からピックアップ、システムメモリは、惑星の残りの部分に、(4分かかる場合があります)、ディスクへのアクセスを、以下の飲み物事務所のボトルを購入する同等の4分、オフィスを出ると同等のものを占有することと等価である(14秒)の本を取るましたプログラムのパフォーマンスを向上させる命令キャッシュヒットミスの数に比べて、それを見ることができ、一年まで旅行し、3ヶ月はより重要です。
複雑なネットワーク環境を経由するため、ネットワークIOは、ネットワークのアクセス速度は、このディスクの速度よりも遅いです。
2.4メモリ
最大的问题是内存不足,导致swap区被占用,从而产生性能问题,对于Java程序来说,我们更多关注GC就可以了。
2.5 连接
系统对外部依赖的中间件,接口比如数据库连接,如果数据量过大或连接过大都会影响性能。
数量量过大会造成TCP的阻塞,根据TCP的一些算法会自动调整发送窗口的大小,导致性能更差。
2.6 Java异常
Java的异常捕获和处理是非常耗费资源的。如果程序在高频率地进行异常捕获和处理也会影响到性能。
三 快速诊断
3.1 资源诊断
资源包括CPU,内存,IO,网络这几个方面。
3.1.1 CPU平均负载
用top命令或uptime命令查看平均负载,这个负载是1分钟内,5分钟内,15分钟内的负载情况。
load average: 2.57, 2.50, 2.56
简单来说,平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数量,也就是活跃的进程数,这个和CPU的使用率没有直接关系。可运行状态的进程,是指正在使用CPU或正在等待CPU的进程,也就是我们ps命令看到的,处于R状态(Running 或Runnable)进程。
不可中断状态的进程,则是正处于内核态关键流程中的进程,不可终端,ps中处于D状态(Uniterruptible Sle也称为Disk Sleep)的进程。不可中断状态实际上是系统对进程和硬件设备的保护,保证磁盘数据和进程数据一致性。
—摘自《Linux性能优化实战》
平均负载多少合适,这个没有绝对的值,和cpu的个数有关系,通过:
cat /proc/cpuinfo |grep "model name"|wc -l
命令查看CPU的逻辑核心数,如果平均负载超过了CPU数量的70%,就需要检查CPU问题了。
比如同样负载为2,在4个cpu上,表示有50%的CPU空闲;在2个CPU上,意味着所有的CPU刚好被完全占用,在一个CPU上,则表示一半的进程进制不到CPU。
CPU另外一个关注点就是关注内核态cpu和用户态的CPU占用,下图中us表示用户态的cpu占用29.2% 内核态CPU占用23.3%。
两个命令比较关键:
#每5s打印一次所有cpu使用情况
mpstat -P ALL 5
#打印 哪个进程占用cpu高 间隔5秒钟输出一组数据 -u表示cpu情况
pidstat -u 5 1
`
3.2 内存占用
通过一下命令来直接定位具体的进程的内存占用情况:
-r 表示查看内存情况。
pidstat -r -p pid 1 3
查看某个进程的IO占用情况,-d表示磁盘查看情况。
pidstat -p pid -d 1 2
- kB_rd/s : 每秒进程从磁盘读取的数据量(以kB为单位)
- kB_wr/s : 每秒进程向磁盘写的数据量(以kB为单位)
#也可以同样查看内存,cpu,io情况
#如果swpd占用比较高,在大数据系统的应用中,大多都禁用swap。
vmstat 1 5
3.3 网络问题的定位
我们可以用strace来跟踪系统的执行和系统的调用。在linux中,进程不能直接访问硬件,要访问硬件,必须从用户态进入到内核态,通过系统调用访问硬件,strace可以跟踪到进程的系统调用,包括参数,返回值和耗费的时间,可以用来排除一些系统调用原因的问题。
#下面的含义是 跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面。
strace -o output.txt -T -tt -e trace=all -p pid
网络IO也可以通过cat /proc/interrupts 看到网络的中断响应情况,我们需要长期观察的话可以通过命令:
watch cat /proc/interrupts
这个命令要查看cpu的中断响应是否均衡,在Java中很少出现这种cpu的中断不平衡问题。
3.4 磁盘IO查看
磁盘的IO可以通过dstat命令来查看,非常清楚看到IO情况:
#pidstat 可以查看具体的进程的IO情况,方便我们具体的定位。
pidstat -d 1 2
3.4 网络连接
我们和外网系统可能有交互,比如连接数据库,用netstat命令查看网络连接情况:
#我常用netstat -antp,这个o可以查看网络的具体连接状态
netstat -anop|grep 3306
连接数过多常也是一个故障点之一。
对于数据库连接数比较多,可能原因是系统不停连接数据库,或者存在慢查询,导致连接数过多的问题。
我们重点关注:TIME-WAIT和CLOSE-WAIT两种状态,其中TIME-WAIT表示主动关闭,CLOSE-WAIT表示被动关闭,如果客户端的并发量持续很高,那么TIME-WAIT数量很多,则可能是客户端连不上服务器端,需要重点关注下。
3.5 线程异常情况
线程异常关注两个问题:1. 线程状态;2.线程的连接数。
系统设计的时候要考虑资源的限制,避免系统的资源使用过度而崩溃,比如控制线程池的最大的连接数。
当系统的SY值过高的,表示Linux要耗费大量时间进行上下文的切换,在Java中,造成这种问题的最可能原因是创建的线程数比较多,这些线程不断地处于阻塞,锁等待,IO等待,状态变化过程中,这就产生了大量的上下文切换。Java在创建线程的时候,会使用堆外内存,在一定情况下,会看到系统报:
unable to create new native thread
这时候就是Java系统创建太多的线程所致,如果想创建更多线程,和想像中的相反,是要缩小些Java的内存,这样可以让OS有更多内存来创建线程,或者是缩小Java的线程里面的数据的大小。
查看线程的方法很多:
cat /proc/pid/status
top -bH -d 3 -p pid
pstree -p pid|wc -l
pstack pid |head -1
线程状态:
Blocked
Waiting
Time_Waiting
New_Runnable
Terminated
重点关注Blocked状态和Time_waiting状态:
3.6 CPU过载诊断
对于Java来说,主要通过一下方法来定位:
- 通过TOP命令或pidstat 命令来定位CPU占用过高的进程。
- top -p pid 后按住shift+H,显示线程情况,观察定位到具体线程号。
- 通过printf “%x\n” 线程id来将线程ID转成16进制的线程ID,因为在java的线程栈中,线程号是16进制展示的。
- 通过jstack -l pid |grep -A 20 16进程线程号,来分析线程具体执行的什么内容。
3.7 OOM
原因:
1.资源不够。
- 申请对象太多,频繁,内存耗尽。
3.特定资源被耗尽,比如频繁创建线程,比如频繁发起网络连接等。
定位方法: - 确认内存分配的大小,通过jmap -heap pid 来查看分配的Java内存情况。
2.找到最耗费内存的对象,通过:jmap -histo:live pid |more 来找到。 - あなたは必ずリソースが使い果たされている、pstreeは、ネジ接続でnetstatの外観は、占有または完了しています。
- メモリ分析は、MATとFull GCを行うために必要な他のツールで分析し、それは生産システムに影響を与える可能性があり、ダンプを使用するのが最適です。
jmap -dump:format=b,file=test.hprof pid
3.8 JVMのGCの問題
プログラムの一時停止中にGCの結果は、頻繁にGCシステムは、必然的に問題を分析するのは簡単なので、それはオープンGCログに最善である、応答の遅れにつながります。
基本的なGC分析はJSTATコマンドで行うことができます。
3.9診断ログ
ログ、エラーをチェックし異常、あなたはすぐにこのようなシステム、またはビューにいくつかのログ解析ツールを監視して、システムの動作を理解することができます。