Tôi đang chạy một bộ kiểm tra tải để xác định hiệu suất của thiết lập sau:
Node.js test suite (client) --> StatsD (server) --> Graphite (server)
Nói tóm lại, bộ kiểm tra node.js sẽ gửi một lượng số liệu đã đặt mỗi x giây cho một cá thể StatsD được đặt trên một máy chủ khác. StatsD sau đó lần lượt xóa các số liệu mỗi giây cho một cá thể Graphite nằm trên cùng một máy chủ. Sau đó, tôi xem xét có bao nhiêu số liệu thực sự được gửi bởi bộ thử nghiệm và bao nhiêu đã được Graphite nhận được để xác định mất gói giữa bộ thử nghiệm và Graphite.
Tuy nhiên tôi nhận thấy rằng đôi khi tôi có tốc độ giảm gói rất lớn (lưu ý rằng nó được gửi với giao thức UDP), dao động từ 20-50%. Vì vậy, đó là khi tôi bắt đầu xem xét nơi các gói tin này bị rơi, vì nó có thể là một số vấn đề về hiệu năng với StatsD. Vì vậy, tôi bắt đầu đăng nhập các số liệu trong mỗi phần của hệ thống để theo dõi nơi xảy ra sự sụt giảm này. Và đây là nơi mọi thứ trở nên kỳ lạ.
Tôi đang sử dụng tcpdump để tạo tệp chụp mà tôi kiểm tra sau khi chạy thử. Nhưng bất cứ khi nào tôi chạy thử nghiệm với tcpdump đang chạy, việc mất gói gần như không có! Có vẻ như tcpdump bằng cách nào đó làm tăng hiệu suất của các bài kiểm tra của tôi và tôi không thể hiểu tại sao và làm thế nào để thực hiện việc này. Tôi đang chạy lệnh sau để ghi nhật ký tin nhắn tcpdump trên cả máy chủ và máy khách:
tcpdump -i any -n port 8125 -w test.cap
Trong một trường hợp thử nghiệm cụ thể, tôi đang gửi 40000 số liệu / s. Kiểm tra trong khi chạy tcpdump có mất gói khoảng 4% trong khi kiểm tra không bị mất gói khoảng 20%
Cả hai hệ thống đang chạy dưới dạng Xen VM với thiết lập sau:
- Intel Xeon E5-2630 v2 @ 2.60GHz
- RAM 2GB
- Ubuntu 14.04 x86_64
Những điều tôi đã kiểm tra nguyên nhân tiềm ẩn:
- Tăng kích thước nhận / gửi bộ đệm UDP.
- Tải CPU ảnh hưởng đến bài kiểm tra. (tải tối đa 40-50%, cả phía máy khách và máy chủ)
- Chạy tcpdump trên các giao diện cụ thể thay vì 'bất kỳ'.
- Chạy tcpdump với '-p' để tắt chế độ lăng nhăng.
- Chỉ chạy tcpdump trên máy chủ. Điều này dẫn đến việc mất gói 20% xảy ra và dường như không ảnh hưởng đến các bài kiểm tra.
- Chỉ chạy tcpdump trên máy khách. Điều này dẫn đến hiệu suất tăng.
- Tăng netdev_max_backlog và netdev_bocate lên 2 ^ 32-1. Điều này làm cho không có sự khác biệt.
- Đã thử mọi cài đặt có thể của chế độ lăng nhăng trên mọi nic (tắt máy chủ và tắt máy khách, tắt máy chủ và bật máy khách, cả bật, tắt cả hai). Điều này làm cho không có sự khác biệt.
ifconfig eth0 promisc
cho phép và ifconfig eth0 -promisc
vô hiệu hóa chế độ lăng nhăng trên eth0. Nếu nó tạo ra sự khác biệt, hãy thử so sánh 4 kết hợp bật / tắt có thể có trên cả hai máy. Điều đó có thể giúp xác định nguồn gốc của các vấn đề.
-p
tùy chọn bỏ qua làm điều đó để xem nếu nó làm cho một sự khác biệt.