我正在使用 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 应用程序不太可能在一台服务器上处理接近这个数字。这是实际流量还是只是您希望能够处理的梦想?您正在运行哪些实际性能监控来支持您每秒处理该数量请求的说法?