Như tiêu đề câu hỏi cho thấy, tôi đang gặp khó khăn để tìm ra những gì có thể được cải thiện trên ứng dụng của mình (hoặc điều chỉnh trong hệ điều hành, ubfox) để đạt được hiệu suất chấp nhận được. Nhưng trước tiên tôi sẽ giải thích kiến trúc:
Máy chủ ngoại vi là một máy 8 lõi với 8 gigs RAM chạy Ubuntu 12.04. Ứng dụng này được viết hoàn toàn bằng javascript và chạy trong node.js v 0.8.22 (vì một số mô-đun dường như phàn nàn trên các phiên bản mới hơn của nút) Tôi sử dụng nginx 1.4 để lưu lượng truy cập http từ cổng 80 và 443 đến 8 nhân viên nút được quản lý và bắt đầu sử dụng api cụm nút. Tôi sử dụng phiên bản mới nhất của socket.io 0.9.14 để xử lý các kết nối websocket, trên đó tôi chỉ kích hoạt websockets và xhr-polling như các phương tiện vận chuyển có sẵn. Trên máy này tôi cũng chạy một phiên bản của Redis (2.2)
Tôi lưu trữ dữ liệu liên tục (như người dùng và điểm số) trên máy chủ thứ hai trên mongodb (3.6) với 4gigs RAM và 2 lõi.
Ứng dụng này đã được sản xuất từ vài tháng nay (nó đã chạy trên một hộp duy nhất cho đến vài tuần trước) và nó được sử dụng bởi khoảng 18 nghìn người dùng mỗi ngày. Nó luôn luôn hoạt động rất tốt ngoài một vấn đề chính: suy giảm hiệu suất. Khi sử dụng, số lượng cpu được sử dụng bởi mỗi quy trình sẽ tăng lên cho đến khi nó thống kê công nhân (sẽ không phục vụ các yêu cầu nữa). Tôi đã tạm thời giải quyết nó kiểm tra cpu được sử dụng bởi mỗi công nhân mỗi phút và khởi động lại nếu nó đạt 98%. Vì vậy, vấn đề ở đây chủ yếu là cpu chứ không phải RAM. RAM không còn là vấn đề nữa kể từ khi tôi cập nhật lên socket.io 0.9.14 (phiên bản trước đó đã bị rò rỉ bộ nhớ), vì vậy tôi nghi ngờ đây là vấn đề rò rỉ bộ nhớ, đặc biệt là vì hiện tại cpu phát triển khá nhanh ( Tôi phải khởi động lại mỗi công nhân khoảng 10-12 lần một ngày!). Thành thật mà nói, RAM được sử dụng cũng tăng lên. nhưng rất chậm, 1 gig mỗi 2-3 ngày sử dụng, và điều kỳ lạ là nó không được phát hành ngay cả khi tôi khởi động lại toàn bộ ứng dụng. Nó chỉ được phát hành nếu tôi khởi động lại máy chủ! điều này tôi thực sự không thể hiểu ...
Bây giờ tôi đã phát hiện ra một cách đáng kinh ngạc, vì vậy cuối cùng tôi cũng có thể thấy những gì đang xảy ra trên máy chủ sản xuất của mình và tôi đang thu thập dữ liệu sau vài ngày. Nếu bất cứ ai muốn xem các biểu đồ tôi có thể cung cấp cho bạn quyền truy cập, nhưng về cơ bản tôi có thể thấy rằng tôi có từ 80 đến 200 kết nối đồng thời! Tôi đã mong đợi node.js xử lý hàng ngàn chứ không phải hàng trăm yêu cầu. Ngoài ra, thời gian phản hồi trung bình cho lưu lượng truy cập http nổi trong khoảng 500 đến 1500 mili giây mà tôi nghĩ là rất nhiều. Ngoài ra, trong thời điểm này với 1300 người dùng trực tuyến, đây là đầu ra của "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
điều đó cho thấy tôi đã có rất nhiều kết nối kín trong thời gian chờ. Tôi đã tăng các tệp mở tối đa lên 999999, đây là đầu ra của 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
Vì vậy, tôi nghĩ rằng vấn đề có thể là do lưu lượng truy cập http vì một số lý do bão hòa các cổng / ổ cắm có sẵn (?), Nhưng có một điều không có ý nghĩa với tôi: tại sao khi tôi khởi động lại công nhân và tất cả các máy khách kết nối lại trong vài giây, tải trên cpu của công nhân giảm xuống 1% và có khả năng phục vụ các yêu cầu đúng cách cho đến khi nó bão hòa sau khoảng 1 giờ (lúc cao điểm)?
Tôi chủ yếu là một lập trình viên javascript, không phải là quản trị viên hệ thống, vì vậy tôi không biết mình nên tải bao nhiêu để xử lý với các máy chủ của mình, nhưng chắc chắn nó không hoạt động như bình thường. Ứng dụng này hoạt động ổn định và vấn đề cuối cùng này đang ngăn cản tôi gửi các phiên bản di động của ứng dụng đã sẵn sàng, vì rõ ràng chúng sẽ mang lại nhiều tải hơn và cuối cùng làm hỏng toàn bộ!
Hy vọng rằng có một điều rõ ràng là tôi đang làm sai, và ai đó sẽ giúp phát hiện ra điều đó ... cứ thoải mái hỏi tôi để biết thêm thông tin, và tôi xin lỗi vì độ dài của câu hỏi nhưng tôi tin là cần thiết ... cảm ơn trước!
top
khi sử dụng cpu gần 100%?