Высокая загрузка ЦП на сервере сбора данных

Я установил небольшую программу на Python, которая использует соединение websocket для получения данных из API и записи их в базу данных postgresql.

Выполняются только две (пользовательские) программы: соединение через веб-узел, которое получает данные и записывает их в базу данных, и еще одна программа, которая является базовым циклом while, который выполняется каждые 15 секунд и проверяет, записываются ли данные.

Обе программы демонтируются с помощью супервизора, и когда в течение 15 секунд не записываются никакие данные, супервизор перезапускается (для обработки разорванного соединения через веб-сокет).

Также я был (очень) ленив и использовал Django ORM для подключения к базе данных вместо psycopg2 напрямую.

Это работает, но у меня постоянно высокая загрузка процессора на сервере. Это сервер с памятью 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

Ну, система тормозит и иногда дает сбой.

Я вижу, что это вызвано высокой нагрузкой ввода-вывода (99 wa). Много спящих процессов. Но я пишу в среднем 400 МБ в день только в базу данных.

Я пробовал модифицировать конфигурацию Postgresql для высокой нагрузки записи, следуя документации и настраивая файл памяти подкачки (1 ГБ), но это не помогло уменьшение средней нагрузки.

Итак, для такого неопытного пользователя, как я, я не знаю, является ли это той нагрузкой, которую я должен ожидать. Могу ли я оптимизировать эту настройку? Если я удалю django ORM и напишу программу, используя только psycopg2, это улучшится? Стоит ли использовать другой метод проверки мертвых соединений через веб-сокеты? Есть ли какая-либо конфигурация сервера, которая может быть оптимизирована для этого случая?

Спасибо!

0
задан 17 February 2018 в 19:46
1 ответ

Мне удалось выяснить, как это исправить, используя эту ссылку http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux /

Обычно я запускал iotop , и тот выводил, какой процесс вызывал высокую нагрузку ввода-вывода. Там я узнал, что нагрузка была из-за чтения базы данных, а не записи. Итак, я понял, что делаю что-то глупое: я много опрашивал всю базу данных, подсчитывая количество записей, проверяя, идет ли запись. Это было в среднем 500 МБ / с чтения. Поэтому я изменил код, чтобы проверить номер первичного ключа последней записи вместо подсчета записей, и ... сработал. Средняя нагрузка теперь 0,01. Спасибо @match за хедзуп

2
ответ дан 4 December 2019 в 13:27

Теги

Похожие вопросы