如何监控 linux 上的进程

How to monitor processes on linux

当可执行文件在 Linux 上 运行 时,它会生成进程、线程、I/O ... 等,并使用来自 C/C++ 等语言的库,有时可能会有定时器有问题,是否可以监控这个?我如何才能深入了解这些软件和流程以及后台发生的事情?

我知道这些东西是我抽象出来的,因为作为普通用户我不应该担心它,但我很好奇我会看到什么。

我需要看的是:

  1. 系统调用这个process/thread。
  2. Open/closed 个插座。
  3. 内存管理和利用,正在访问什么块。
  4. 内存指令。
  5. 如果一个过程依赖于另一个过程的结果。
  6. 如果 process/thread 终止,为什么,它是否成功?
  7. I/O 操作和数据库 read/write 如果有的话。

您想要监控的不同事物可能需要不同的工具。我将在下面提到的所有工具都有详尽的手册页,您可以在其中找到确切的使用方法。

System calls for this process/thread.

strace 命令正是这样做的——它准确地列出了您的程序调用了哪些系统调用。 ltrace 工具类似,但侧重于对库函数的调用 - 而不仅仅是系统调用(涉及内核)。

Open/closed sockets.

strace/ltrace 命令将列出套接字创建等内容,但如果您想知道哪些套接字处于打开状态 - 连接、侦听等 - 现在,有 netstat 实用程序,列出系统中所有已连接(或使用“-a”,也正在监听)的套接字,以及它们属于哪个进程。

Memory management and utilization, what block is being accessed. Memory instructions.

同样,ltrace 会让您看到所有的 malloc()/free() 调用,但是要准确查看正在访问哪些内存,您需要一个调试器,例如 gdb.问题是你的程序所做的几乎所有事情都是“内存指令”,所以你需要确切地知道你在寻找什么,有断点、跟踪点、single-stepping 等等,而且通常不需要只想查看程序中的每个内存访问。

如果您不想查找所有内存访问,而是要搜索此区域中的 bug - 例如在释放内存后访问内存等,有一些工具可以帮助您更轻松地找到那些。其中一个名为 ASAN(“Address Sanitizer”)的工具内置于 C++ 编译器中,因此您可以在启用它的情况下构建并获取有关错误访问模式的消息。您可以使用的另一个是 valgrind.

最后,如果通过“内存利用率”您只是想检查您的进程或线程使用了多少内存,那么 pstop可以告诉你。

If a process is depending on the results of another one. If a process/thread terminates, why, and was it successful?

我提到的各种工具,如 strace/ltrace 会在它们遵循的过程退出时通知您。任何进程都可以打印其中一个进程的退出代码 sub-processes,但我不知道有什么工具可以打印系统中所有进程的退出状态。

I/O operations

iostat 可以定期向您汇总每个磁盘完成了多少 IO。 netstat -s 为您提供网络统计信息,以便您可以查看完成了多少网络操作。 vmstat 为您提供由交换 in/out 引起的 IO 的统计信息(如果这是您的情况的问题)。

and DB read/write if any.

这取决于您的数据库,我想,以及您如何监控它。