질문 제목에서 알 수 있듯이 수용 가능한 성능을 달성하기 위해 응용 프로그램에서 개선 될 수있는 것을 파악하기가 어렵습니다 (또는 os, 우분투에서 조정). 그러나 먼저 아키텍처를 설명하겠습니다.
프론트 엔드 서버는 Ubuntu 12.04를 실행하는 8 기가 RAM이있는 8 코어 시스템입니다. 응용 프로그램은 완전히 자바 스크립트로 작성되고 node.js v 0.8.22에서 실행됩니다 (일부 모듈은 최신 버전의 노드에서 불평하는 것처럼 보입니다) nginx 1.4를 사용하여 관리되는 포트 80 및 443에서 8 노드 작업자에게 http 트래픽을 프록시 처리합니다. 노드 클러스터 API를 사용하기 시작했습니다. 웹 소켓 연결을 처리하기 위해 최신 버전의 socket.io 0.9.14를 사용합니다. 웹 소켓 및 xhr-polling 만 사용 가능한 전송으로 활성화했습니다. 이 머신에서도 Redis (2.2) 인스턴스를 실행합니다
4gigs RAM과 2 코어로 mongodb (3.6)의 두 번째 서버에 사용자 및 점수와 같은 영구 데이터를 저장합니다.
이 앱은 몇 달 (몇 주 전까지 단일 상자에서 실행 중)부터 운영되고 있으며 하루에 약 18k 명의 사용자가 사용하고 있습니다. 성능 저하라는 한 가지 주요 문제와는 별개로 항상 잘 작동했습니다. 사용하면 각 프로세스에서 사용하는 CPU의 양이 작업자를 더 이상 요청하지 않을 때까지 증가합니다 (더 이상 요청을 처리하지 않음). 매 분마다 각 작업자가 사용중인 CPU를 확인하고 98 %에 도달하면 다시 시작하여 일시적으로 해결했습니다. 따라서 여기서 문제는 주로 CPU가 아니라 RAM입니다. socket.io 0.9.14 (이전 버전은 메모리 누수)로 업데이트 한 이후 RAM이 더 이상 문제가되지 않으므로 메모리 누수 문제가 의심됩니다. 특히 CPU가 상당히 빠르게 커지기 때문에 특히 나는 하루에 약 10-12 번 각 근로자를 다시 시작해야합니다!). 사용중인 RAM이 정직하게 커지고 그러나 매우 느리게, 2-3 일마다 1 기가 사용되며, 이상한 점은 전체 응용 프로그램을 완전히 다시 시작해도 해제되지 않는다는 것입니다. 서버를 재부팅하면 해제됩니다! 이건 정말 이해가되지 않습니다 ...
이제 놀라운 nodefly 를 발견 하여 프로덕션 서버에서 무슨 일이 일어나고 있는지 확인할 수 있으며 며칠 후에 데이터를 수집하고 있습니다. 누구나 차트를보고 싶다면 액세스 권한을 부여 할 수 있지만 기본적으로 80 ~ 200 개의 동시 연결이 있음을 알 수 있습니다! node.js가 수백 건의 요청이 아닌 수천 건을 처리 할 것으로 기대했습니다. 또한 http 트래픽의 평균 응답 시간은 500 ~ 1500 밀리 초 사이이며 실제로는 많이 생각합니다. 또한 현재 1300 명의 사용자가 온라인 상태 인 순간, 이것은 "ss -s"의 출력입니다.
Total: 5013 (kernel 5533)
TCP: 8047 (estab 4788, closed 3097, orphaned 139, synrecv 0, timewait 3097/0), ports 0
Transport Total IP IPv6
* 5533 - -
RAW 0 0 0
UDP 0 0 0
TCP 4950 4948 2
INET 4950 4948 2
FRAG 0 0 0
이것은 시간 대기 상태에서 많은 닫힌 연결이 있음을 보여줍니다. 최대 열린 파일을 999999로 늘 렸습니다. 여기에 ulimit -a의 출력이 있습니다.
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 63724
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 999999
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 63724
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
그래서 문제가 http 트래픽에 어떤 이유로 사용 가능한 포트 / 소켓 (?)을 포화시킬 수 있다고 생각했지만 한 가지 이해가되지 않습니다. 왜 작업자를 다시 시작하고 모든 클라이언트가 몇 초 내에 다시 연결되는지, 작업자의 CPU 부하가 1 %로 내려 가고 약 1 시간 (피크 타임) 후에 포화 될 때까지 요청을 제대로 처리 할 수 있습니까?
나는 주로 sys 관리자가 아닌 자바 스크립트 프로그래머이므로 서버로 처리 해야하는 부하가 얼마인지는 모르지만 반드시 제대로 작동하지는 않습니다. 응용 프로그램은 그렇지 않으면 안정적 이며이 마지막 문제는 준비가 된 모바일 버전의 응용 프로그램을 배송하지 못하게합니다. 분명히 더 많은로드를 가져 와서 결국 모든 것을 중단시킬 것입니다!
바라건대 내가 잘못하고있는 것이 분명하고 누군가가 그것을 발견하는 데 도움이 될 것입니다 ... 자세한 정보를 요청하십시오. 질문의 길이는 미안하지만 필요하다고 생각했습니다 ... 미리 감사드립니다!
top
CPU 사용량이 100 %에 가까울 때 무엇을 보십니까?