2016-10-05 15 views
6

Có thể giới hạn băng thông kênh hoặc toàn cầu của máy chủ bằng Netty không?Băng thông máy chủ ga bằng phần trăm sử dụng Netty

Tôi có thể đặt giới hạn tốc độ đọc hoặc ghi rõ ràng qua GlobalChannelTrafficShapingHandler, nhưng tôi đang cố gắng giới hạn băng thông toàn cầu của máy chủ khoảng một nửa băng thông có sẵn. Vì vậy, nếu máy chủ có thể tải lên với tốc độ 8MB/giây, tôi muốn giới hạn tải lên khoảng 4MB/s. Và tôi muốn máy chủ điều chỉnh các thay đổi băng thông sẵn có; vì vậy nếu tốc độ tải lên của máy chủ giảm xuống còn 5MB/s (có lẽ do việc sử dụng mạng bởi các ứng dụng khác), thì tôi muốn giới hạn tốc độ thành apprx 2,5MB/s.

Tôi đã chơi với ghi đè AbstractTrafficShapingHandler.submitWrite() và thêm thời gian trễ dựa trên thời lượng từ cuộc gọi trước đó, nhưng logic dường như mong manh và không đáng tin cậy.

Bất kỳ ý tưởng nào về cách tiếp cận thông minh vấn đề này một cách thông minh?

+0

Có thể QoS sẽ dễ dàng hơn trong trường hợp này. Nếu bạn đang sử dụng Linux, hãy thử http://superuser.com/questions/309063/how-can-i-prioritise-network-bandwidth-on-a-per-application-basis – kichik

+0

@kichik Đây là một ứng dụng Java chạy trên Win/Mac/Linux. – dejuknow

+0

Rất khó để biết "băng thông có sẵn" là gì. Những thứ như "tốc độ liên kết" có khả năng hoàn toàn vô dụng vì trên hầu hết các hệ thống, nút cổ chai có thể là một nơi nào đó xa hơn xuống dòng. Ngoài ra, nhìn vào băng thông tổng hợp được ứng dụng sử dụng không có khả năng rất chính xác vì nó phụ thuộc đồng thời vào các ứng dụng khác trên máy chủ và bất kỳ nút cổ chai nào có thể cụ thể cho bất kỳ khách hàng nào đang ở cuối kết nối TCP/IP của bạn . – BeeOnRope

Trả lời

3

Bạn đã cân nhắc sử dụng GlobalTrafficShapingHandler và định kỳ cho phép nó đi đầy đủ ga để tìm ra băng thông tối đa của máy chủ và sau đó giới hạn nó thành một nửa không?

Tôi định kỳ sẽ làm như sau (theo một lịch trình, có lẽ 1 giây trong mỗi phút)

  • Tăng setReadLimitsetWriteLimit để tối đa bao giờ bạn sẽ cho phép
  • sử dụng GlobalTrafficShapingHandler s TrafficCounter (thông qua public trafficCounter()) để đặt lại số lượng bằng cách gọi số resetCumulativeTime
  • Đảm bảo khoảng thời gian TrafficCounter ngắn hơn hoặc bằng thời gian bạn muốn lấy mẫu. Thay đổi này bằng TrafficCounter.configure(long)
  • Sample các TrafficCounter để có được những máy chủ tối đa băng thông
  • Sửa đổi GlobalTrafficShapingHandler sử dụng một nửa số băng thông mà bạn vừa tính

Tôi nghĩ rằng ở trên sẽ cho bạn những gì bạn muốn mà không bị quá mong manh.

+0

Tôi sẽ trao phần thưởng. Đây là nhiều hơn hoặc ít hơn những gì tôi đã cố gắng làm gì khi thêm một sự chậm trễ để AbstractTrafficShapingHandler.submitWrite() (trừ tôi đã lấy mẫu mọi yêu cầu khác). Tôi cho rằng tuyến đường lấy mẫu định kỳ là cách tốt nhất để đi. Cám ơn! – dejuknow

Các vấn đề liên quan