我有一个 Linux 网络服务器。它运行 Apache 和基于 Python 的网络应用程序以及 Postgres。它相当慢。通过运行ab
(Apache 基准测试),vmstat
我可以看到它在请求传入时进行交换。
是否有任何程序可以动态地告诉我哪些过程导致了这种交换?
答案1
iotop可能就是您想要的。您需要安装 Python 2.5 或更高版本,这很可能是的。您还需要启用几个内核(2.6.20 或更高版本)选项(TASK_DELAY_ACCT 和 TASK_IO_ACCOUNTING),以便在 /proc 中显示正确的指标,以供 iotop 使用。
答案2
你绝对应该从 apache 中删除所有不必要的模块。这很重要很多. 关闭扩展状态、自动索引等。
将 AllowOverride 设置为“None”并在服务器配置中执行任何 htaccess 操作将有助于 I/O 并减少响应时间,从而减少每分钟的内存使用量。
还可以查找 postgresql 文档来提高性能并减少内存使用。
可能你最大的内存占用者是 Python 程序,因为 Python 并没有针对低内存使用进行很好的优化。你可以在应用程序上尝试使用分析器。
答案3
如果该活动是在执行许多 HTTP 请求时发生的,而不是在其他时间发生的,那么将是 Apache 和 python 进程主动导致交换活动。
如果没有更多的信息,我们无法透露更多。
- 您如何运行 Python 脚本?(CGI、FCGI、mod_python、其他?)
- ab 被告知尝试多少个并发请求?
- 机器中有多少内存?(可能只是机器容量不足以完成这项工作)
- 有多少个 Apache 进程正在运行?
- 如果是 FGCI,那么您正在运行多少个 Python 进程?
一般来说,为了减少 Apache 的内存使用,您需要通过改变配置文件来减少它将启动的子进程的数量,如果您使用 FastCGI,那么 python 进程的数量也是一样的。
答案4
但根本的问题是……
我们无法通过当前的 ps 或 top 命令看到或了解 Linux 如何处理内存。这是一个谜。
更重要的是,在多核系统中,Linux 中的系统会计应用程序需要改进