数据采集​​服务器 CPU 负载过高

数据采集​​服务器 CPU 负载过高

我已经设置了一个小型 python 程序,它使用 websocket 连接从 API 获取数据并将其写入 postgresql 数据库。

只有两个(用户)程序正在运行:接收数据并将其写入数据库的 websocket 连接,以及另一个基本程序,该程序每 15 秒运行一次并检查是否正在写入数据。

两个程序都由 Supervisor 守护,当 15 秒内没有写入数据时,Supervisor 就会重新启动(以处理无效的 websocket 连接)。

而且我非常懒,使用 Django ORM 来为我建立数据库连接,而不是直接使用 psycopg2。

它可以工作,但我的服务器上的 CPU 负载一直很高。这是一台 1CPU 1Gb 内存的服务器(AWS micro)。Top 命令输出以下内容:

top - 17:10:58 up 19 days, 15:03,  1 user,  load average: 1,57, 1,63,    1,58
Tasks: 116 total,   1 running, 115 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0,3 us,  0,3 sy,  0,0 ni,  0,0 id, 99,0 wa,  0,0 hi,  0,0 si,  0,3 st
 KiB Mem :  1014552 total,    63440 free,    86572 used,   864540 buff/cache
 KiB Swap:  1048572 total,   987380 free,    61192 used.   615096 avail Mem

嗯,系统有点迟缓,有时会崩溃。

我可以看到这是由高 IO 负载 (99 wa) 引起的。有很多休眠进程。但我每天仅在数据库上平均写入 400MB。

我尝试按照文档修改 Postgresql 配置以实现高写入负载并设置交换内存文件(1GB),但这些并没有帮助减轻平均负载。

因此,对于像我这样的没有经验的用户,我不知道这是否是我应该预期的负载。我可以优化此设置吗?如果我删除 django ORM 并仅使用 psycopg2 编写程序,它会有所改善吗?我是否应该为无效的 websocket 连接制定不同的检查方法?是否有任何服务器配置可以针对这种需求情况进行优化?

谢谢!

答案1

我设法弄清楚如何使用此链接修复它http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/

基本上,我运行iotop并输出了导致高 IO 负载的进程。在那里我发现负载是由于读取数据库而不是写入造成的。所以我意识到我做了一件蠢事:我通过计算条目数来查询整个数据库,同时检查它是否正在记录。平均读取速度为 500MB/s。所以我改变了代码,检查最后一个条目的主键号,而不是计数条目,然后……成功了。平均负载现在是 0.01。感谢 @match 的提醒

相关内容