繁体   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