데이터 수집 서버의 높은 CPU 부하

데이터 수집 서버의 높은 CPU 부하

저는 websocket 연결을 사용하여 API에서 데이터를 획득하고 이를 postgresql 데이터베이스에 쓰는 작은 Python 프로그램을 설정했습니다.

실행 중인 (사용자) 프로그램은 두 개뿐입니다. 데이터를 수신하여 데이터베이스에 쓰는 websocket 연결과 15초마다 실행되고 데이터가 기록되고 있는지 확인하는 기본 while 루프인 또 다른 프로그램입니다.

두 프로그램 모두 감독자와 함께 데몬화되며 15초 동안 데이터가 기록되지 않으면 감독자가 다시 시작됩니다(죽은 웹소켓 연결을 처리하기 위해).

또한 나는 (매우) 게으르고 Django ORM을 사용하여 psycopg2 대신 직접 db 연결을 수행했습니다.

작동하지만 서버의 CPU 로드가 꾸준히 높습니다. 1CPU 1Gb 메모리 서버(AWS 마이크로)입니다. 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 로드(99wa)로 인해 발생하는 것으로 보입니다. 많은 수면 과정. 그런데 데이터베이스에만 하루 평균 400MB를 쓰고 있어요.

문서 작성 후 높은 쓰기 로드를 위해 Postgresql 구성을 수정하고 스왑 메모리 파일(1GB)을 설정하려고 시도했지만 평균 로드를 완화하는 데 도움이 되지 않았습니다.

그래서 저처럼 경험이 없는 사용자에게는 이 정도의 부하를 예상해야 할지 모르겠습니다. 이 설정을 최적화할 수 있나요? django ORM을 제거하고 psycopg2만 사용하여 프로그램을 작성하면 개선될까요? 죽은 웹소켓 연결에 대해 다른 확인 방법을 만들어야 합니까? 이 요구 사항에 맞게 최적화할 수 있는 서버 구성이 있습니까?

감사해요!

답변1

이 링크를 사용하여 문제를 해결하는 방법을 알아냈습니다.http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/

기본적으로 실행하여 iotop어떤 프로세스가 높은 IO 로드를 유발하는지 출력했습니다. 거기에서 나는 데이터베이스를 읽는 것이 아니라 쓰는 것이 아니라 로드가 발생한다는 것을 알게 되었습니다. 그래서 나는 내가 뭔가 어리석은 짓을 하고 있다는 것을 깨달았습니다. 나는 기록 중인지 확인하면서 항목 수를 세어 전체 데이터베이스에 쿼리를 많이 하고 있었습니다. 이는 평균 500MB/s의 읽기 속도였습니다. 그래서 항목을 계산하는 대신 마지막 항목의 기본 키 번호를 확인하도록 코드를 변경했고... 작동했습니다. 이제 평균 로드는 0.01입니다. 알려주셔서 감사합니다 @match

관련 정보