Я установил небольшую программу на Python, которая использует соединение с веб-сокетом для получения данных из 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 ВА). Много спящих процессов. Но я пишу в среднем 400МБ в день только в базу.
Я пробовал модифицировать конфигурацию Postgresql для высокой нагрузки на запись, следуя документации и настраивая файл памяти подкачки (1 ГБ), но это не помогло снизить среднюю нагрузку.
Итак, для такого неопытного пользователя, как я, я не знаю, следует ли мне ожидать такой нагрузки. Могу ли я оптимизировать эту настройку? Если я удалю django ORM и напишу программу, используя только psycopg2, улучшится ли она? Стоит ли использовать другой метод проверки мертвых соединений через веб-сокеты? Есть ли какая-либо конфигурация сервера, которую можно оптимизировать для этого случая?
Спасибо!
Мне удалось выяснить, как это исправить по этой ссылке http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/
В основном я бегал iotop
и выяснилось, какой процесс вызывает высокую нагрузку ввода-вывода. Там я узнал, что нагрузка была из-за чтения базы данных, а не записи. Итак, я понял, что делаю что-то глупое: я много опрашивал всю базу данных, подсчитывая количество записей, проверяя, идет ли запись. Это было в среднем 500 МБ / с чтения. Поэтому я изменил код, чтобы проверить номер первичного ключа последней записи вместо подсчета записей, и ... сработал. Средняя нагрузка теперь 0,01. Спасибо @match за хедзуп