簡體   English   中英

如何監控 linux 上的進程

[英]How to monitor processes on linux

當可執行文件在 Linux 上運行時,它會生成進程、線程、I/O... 等,並使用來自 C/C++ 等語言的庫,有時可能會出現計時器問題,是否可以對此進行監控? 如何深入了解這些軟件和流程以及后台發生的情況?

我知道這些東西是從我身上抽象出來的,因為作為普通用戶,我不應該擔心它,但我很好奇我會看到什么。

我需要看到的是:

  1. 此進程/線程的系統調用。
  2. 打開/關閉 sockets。
  3. Memory 管理和利用,正在訪問什么塊。
  4. Memory 指令。
  5. 如果一個過程取決於另一個過程的結果。
  6. 如果一個進程/線程終止,為什么,它是否成功?
  7. I/O 操作和 DB 讀/寫(如果有)。

呢?

在那個頁面上有不止一個 linux/Unix 命令,它們可能會派上用場。

您想要監控的不同事物可能需要不同的工具。 我將在下面提到的所有工具都有大量的手冊頁,您可以在其中准確找到如何使用它們。

此進程/線程的系統調用。

strace命令正是這樣做的——它准確地列出了您的程序調用了哪些系統調用。 ltrace工具類似,但側重於對庫函數的調用——不僅僅是系統調用(涉及內核)。

打開/關閉 sockets。

strace/ltrace 命令將列出套接字創建等內容,但如果您想知道哪些 sockets 已打開 - 已連接、正在偵聽等 - 現在,有netstat實用程序,它列出了所有已連接的(或帶有“ -a",也在監聽)系統中的sockets,以及它們屬於哪個進程。

Memory 管理和利用,正在訪問什么塊。 Memory 指令。

再次 ltrace 將讓您查看所有 malloc()/free() 調用,但要確切了解 memory 正在訪問的位置,您需要一個調試器,例如gdb 問題是您的程序所做的幾乎所有事情都是“內存指令”,因此您需要確切地知道您在尋找什么,包括斷點、跟蹤點、單步執行等等,而且通常不只是想要查看程序中的每個 memory 訪問。

如果您不想找到所有 memory 訪問,而是要搜索該區域中的錯誤- 例如在 memory 被釋放后訪問等等,有一些工具可以幫助您更輕松地找到這些錯誤。 其中一個稱為ASAN (“Address Sanitizer”)內置於 C++ 編譯器中,因此您可以啟用它進行構建並獲取有關錯誤訪問模式的消息。 您可以使用的另一個是valgrind

最后,如果通過“內存利用率”來檢查您的進程或線程正在使用多少 memory,那么pstop都可以告訴您。

如果一個過程取決於另一個過程的結果。 如果一個進程/線程終止,為什么,它是否成功?

我提到的各種工具(例如 strace/ltrace)會在它們遵循的進程退出時通知您。 任何進程都可以打印其子進程之一的退出代碼,但我不知道有一種工具可以打印系統中所有進程的退出狀態。

輸入輸出操作

iostat可以定期總結每個磁盤執行了多少 IO。 netstat -s為您提供網絡統計信息,以便您查看完成了多少網絡操作。 vmstat為您提供由換入/換出引起的 IO 的統計信息(以防您遇到問題)。

和數據庫讀/寫(如果有)。

這取決於你的數據庫,我猜,以及你如何監控它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM