[英]How to monitor processes on linux
当可执行文件在 Linux 上运行时,它会生成进程、线程、I/O... 等,并使用来自 C/C++ 等语言的库,有时可能会出现计时器问题,是否可以对此进行监控? 如何深入了解这些软件和流程以及后台发生的情况?
我知道这些东西是从我身上抽象出来的,因为作为普通用户,我不应该担心它,但我很好奇我会看到什么。
我需要看到的是:
顶呢?
在那个页面上有不止一个 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,那么ps和top都可以告诉您。
如果一个过程取决于另一个过程的结果。 如果一个进程/线程终止,为什么,它是否成功?
我提到的各种工具(例如 strace/ltrace)会在它们遵循的进程退出时通知您。 任何进程都可以打印其子进程之一的退出代码,但我不知道有一种工具可以打印系统中所有进程的退出状态。
输入输出操作
有iostat可以定期总结每个磁盘执行了多少 IO。 netstat -s为您提供网络统计信息,以便您查看完成了多少网络操作。 vmstat为您提供由换入/换出引起的 IO 的统计信息(以防您遇到问题)。
和数据库读/写(如果有)。
这取决于你的数据库,我猜,以及你如何监控它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.