Apache django mysql 非常慢

Apache django mysql 非常慢

我正在使用 Django、wsgi 和 apache,但是当我尝试将数据插入 mysql 服务器时,服务器真的很慢。在表中插入 200 行需要 1 秒钟。奇怪的是,apache 和 mysql 只使用了 3% 的 CPU 和内存。我确信有些设置错误,但我找不到它。

这是我的 apache 配置文件、wsgi 设置和“top”命令结果。

如果有人能帮助我,我将不胜感激。谢谢!

我的apache配置文件:

WSGIScriptAlias / "/home/jiechao/EZ_Green/apache/ems_django.wsgi"
ServerName www.ezgreenbuildings.com
WSGIDaemonProcess ezgreenbuildings.com processes=2 maximum-requests=1000 threads=25
WSGIProcessGroup ezgreenbuildings.com

wsgi文件:

os.environ['DJANGO_SETTINGS_MODULE'] = 'ems.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

sys.path.append("/home/jiechao/EZ_Green/django")
sys.path.append("/home/jiechao/EZ_Green/django/ems")

top 命令结果:

top - 15:56:02 up 25 days, 19:30,  1 user,  load average: 0.74, 0.24, 0.11
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.8%us,  0.7%sy,  0.0%ni, 58.5%id, 40.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4124236k total,  3242020k used,   882216k free,   157960k buffers
Swap:  4192252k total,      440k used,  4191812k free,  2750284k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 6487 www-data  20   0  101m  63m 7288 S    1  1.6   0:03.02 apache2
30558 mysql     20   0  313m  44m 7020 S    1  1.1   0:54.98 mysqld
  258 root      20   0     0    0    0 D    1  0.0   1:09.21 jbd2/sda1-8
10243 root      20   0     0    0    0 S    0  0.0   0:00.04 kworker/1:1
14410 jiechao   20   0  208m 8268 3296 S    0  0.2   4:39.92 python
    1 root      20   0  3504 1876 1276 S    0  0.0   0:01.58 init
    2 root      20   0     0    0    0 S    0  0.0   0:00.13 kthreadd
    3 root      20   0     0    0    0 S    0  0.0   0:45.39 ksoftirqd/0
    5 root      20   0     0    0    0 S    0  0.0   0:00.40 kworker/u:0
    6 root      RT   0     0    0    0 S    0  0.0   0:00.00 migration/0
    7 root      RT   0     0    0    0 S    0  0.0   0:03.85 watchdog/0

編輯後。

我现在添加了“WSGIProcessGroup”,所以它现在应该正在调用守护进程模式。我正在使用 Prefork 进行 MPM,但我不明白如何查看 MPM 的设置。

对于网站访问量,我认为每秒 1000 次访问是我所期望的。

答案1

你遇到了一些问题。

您缺少 WSGIProcessGroup 指令,这意味着 WSGIDaemonProcess 是多余的,甚至没有被使用。您在那里以嵌入模式而不是守护进程模式运行。除非您知道如何正确设置 Apache,否则嵌入模式不是一个好主意。阅读:

如果您已设法对其进行配置以便正确使用守护进程模式,那么您的进程/线程设置将会非常高,并且可能会占用系统上的大量内存,可能会导致它开始交换并降低系统速度。

根据缺少的 WSGIProcessGroup,您至少尚未调用它。

在嵌入式模式下运行给自己造成的问题有多大,实际上取决于您使用的 Apache MPM 是什么以及 MPM 设置是什么。

因此,在进一步调试之前,您需要确定您使用的是 Apache prefork 还是 worker MPM,以及您使用的 MPM 设置是什么。获取该信息并编辑您的问题,添加其他信息。

另外,请对您的网站每秒实际处理的请求数进行现实的估计。这样可以评估 MPM 和守护进程进程/线程设置的错误程度。

如需更多阅读材料,请参阅:

其中的内容将帮助您确定您正在使用哪个 MPM,以及使用的是嵌入式模式还是守护进程模式。此外,是否还加载了 mod_python,这也可能带来另一种麻烦。


更新 1

Apache MPM 设置位于 Apache 配置文件中。请阅读有关 MPM 设置的 Apache 文档,以便了解它们是什么。尤其是对于 prefork MPM,如果您不了解它们是什么以及如何正确设置它们来调整您的网站,您将会失败。

至于每秒 1000 次访问的说法,如果这是真的,那么使用 1000 的最大请求数将极大地减慢速度,因为您的 Web 应用程序进程将每隔几秒钟重新启动一次,而这样做的延迟将减慢一切速度。如果可以避免,您永远不应该在生产系统上使用最大请求数。

坦白说,我对您每秒处理 1000 次访问的说法表示怀疑。使用数据库的 Django 应用程序不太可能在一台服务器上处理接近这个数字。这是实际流量还是只是您希望能够处理的梦想?您正在运行哪些实际性能监控来支持您每秒处理该数量请求的说法?

相关内容