12

Đầu tiên, một chút nền. Có rất nhiều so sánh khác nhau về các hệ thống điều khiển phiên bản phân tán (DVCS) so sánh kích thước của kho lưu trữ, hoặc tốc độ chuẩn của các hoạt động. Tôi đã không tìm thấy bất kỳ điều đó sẽ chuẩn mạng hiệu suất của DVCS khác nhau, và các giao thức khác nhau được sử dụng ... bên cạnh đo tốc độ hoạt động (lệnh) liên quan đến mạng như 'clone', 'kéo'/'lấy' hoặc 'đẩy'.Cách đo hiệu suất mạng (cách thức giao thức mạng điểm chuẩn)

Tôi muốn biết sau đó bạn sẽ so sánh như thế nào; làm thế nào để đo lường hiệu suất mạng của một ứng dụng, hoặc làm thế nào để chuẩn giao thức mạng. Tôi hình dung ở đây trong số những người khác cũng đo lường sự phụ thuộc của hiệu suất trên cả băng thông của mạng và độ trễ (thời gian ping) của mạng; một số giao thức hy sinh độ trễ dưới hình thức trao đổi chuyến đi khứ hồi hơn (đàm phán) để gửi gói "cuối cùng" yêu cầu tối thiểu.

Tôi muốn các giải pháp chỉ liên quan đến một máy tính, nếu có thể. Tôi muốn xem các giải pháp nguồn mở, làm việc trên Linux. Nhưng tôi cũng sẽ hoan nghênh các câu trả lời chung chung hơn.

Preferred OS: Linux
ngôn ngữ ưa thích: C, Perl, vỏ kịch bản


đo có thể:

  • tổng số byte truyền từ máy chủ cho khách hàng và từ khách hàng đến máy chủ trong một ssion; này cũng có thể được sử dụng để đo lường chi phí của giao thức (băng thông)
  • số tròn các chuyến đi (kết nối) trong một giao dịch (độ trễ)
  • phụ thuộc của tốc độ của mạng lưới hoạt động (thời gian cần thiết để sao chép/kéo/đẩy) từ băng thông mạng và từ độ trễ mạng (thời gian ping)

Làm cách nào để thực hiện các phép đo như vậy?


Added 02-06-2009:
Một đơn giản nhất benchmark (đo lường) sẽ là một phiên bản mạng của time lệnh, tức là lệnh mà chạy sẽ cung cấp cho tôi số điện thoại của byte chuyển nhượng, và số lượng các chuyến đi vòng/kết nối mạng trong khi thực thi lệnh đã cho.


Added 09-06-2009:
Ví dụ đầu ra tưởng tượng cho giải pháp nêu trên của phiên bản mạng của time lệnh có thể trông giống như sau:

$ ntime git clone -q git://git.example.com/repo.git 
... 
bytes sent: nnn (nn kiB), bytes received: nnn (nn kiB), avg: nn.nn KB/s 
nn reads, nn writes 

Lưu ý rằng nó là chỉ một ví dụ đầu ra, chi tiết loại thông tin mà người ta có thể muốn nhận được.


Added 09-06-2009:
Dường như một số những gì tôi muốn có thể đạt được bằng dummynet, công cụ (ban đầu) cho các giao thức thử nghiệm mạng ...

+0

Bạn đang hỏi, cách lấy dữ liệu cần thiết để tìm ra các điểm chuẩn như vậy cho một chương trình được nối mạng tùy ý? – none

+0

Có, tôi muốn có tối thiểu nhận được tổng số byte chuyển và có lẽ số thay đổi từ đọc để viết cho một lệnh nhất định, một cái gì đó như thời gian/thời gian cho CPU và bộ nhớ, và SystemTap iotimes cho I/O. –

+0

Tôi nghĩ rằng để thực sự trả lời câu hỏi của bạn, bạn nên lý tưởng cho chúng tôi biết thêm về nền tảng/HĐH ưa thích của bạn, cũng như ngôn ngữ lập trình ưa thích của bạn. Ngoài ra, một danh sách chi tiết các phép đo mà bạn quan tâm, sẽ cho chúng tôi biết cách tiếp cận nào là khả thi nhất. – none

Trả lời

15

Nếu Tôi hiểu bạn một cách chính xác, bạn về cơ bản quan tâm đến một cái gì đó như Linux 'strace' (Introduction) cho các cuộc gọi hệ thống mạng cụ thể?

Có thể là sự kết hợp giữa trình thu thập thông tin và trình gỡ lỗi, đối với các ứng dụng mạng (tức là 'ntrace'), cung cấp phân tích chi tiết về các phép đo tùy chọn khác nhau?

Dưới Linux, tiện ích strace chủ yếu dựa vào chức năng được cung cấp bởi hạt nhân Linux, cụ thể là ptrace (process tracing) API:

Sử dụng ptrace, chúng ta có thể để có được hầu hết các dữ liệu mà bạn đang quan tâm.

Trên Windows, có thể bạn sẽ muốn xem xét detours để đánh chặn/chuyển hướng các cuộc gọi API Winsock cho mục đích kiểm tra/đo điểm chuẩn.

Nếu bạn không thực sự cần tất cả thông tin ở mức độ thấp, bạn cũng có thể sử dụng trực tiếp strace (trên linux) và chỉ sử dụng nó để theo dõi các cuộc gọi hệ thống nhất định, ví dụ: đến syscall mở (Sử dụng tham số -o FILE bổ sung, bạn có thể chuyển hướng tất cả ra một file đầu ra):

strace -e trace=open -o results.log

Bằng cách vượt qua một lá cờ -v bổ sung cho strace, bạn có thể tăng cấp chi tiết của nó để có được thông tin bổ sung (khi làm việc với các SCM như git bao gồm nhiều tiện ích shell nhỏ hơn và các công cụ độc lập, có thể bạn cũng sẽ muốn xem xét sử dụng -f để cũng theo các quy trình được chia nhỏ).

Vì vậy, những gì bạn sẽ quan tâm đến, là tất cả syscalls có liên quan đến sockets, cụ thể là:

  • chấp nhận
  • bind
  • kết nối
  • getpeername
  • getsockname
  • getsockopt
  • nghe
  • recv
  • recvfrom
  • gửi
  • sendto
  • setsockopt
  • shutdown
  • ổ cắm
  • socketpair

(trong đầu, có thể bạn sẽ chỉ muốn xem xét giao dịch với lệnh gửi .../recv ..., mặc dù)

Để đơn giản hóa này, bạn cũng có thể sử dụng "mạng" là tham số để theo dõi, mà sẽ theo dõi tất cả các cuộc gọi liên quan đến mạng:

-e dấu vết = mạng: Trace tất cả các mạng liên quan đến các cuộc gọi hệ thống.

Vì vậy, một strace gọi tương ứng có thể trông như thế này:

strace -v -e trace=accept,bind,connect,getpeername,getsockname,getsockopt,listen,recv,recvfrom,send,sendto setsockopt,shutdown,socket,socketpair -o results.log -f git pull

Khi chương trình chạy xong, bạn sẽ sau đó chủ yếu là muốn kiểm tra các log file để đánh giá dữ liệu, điều này sau đó có thể dễ dàng đạt được bằng cách sử dụng cụm từ thông dụng.

Ví dụ, khi chạy sau trong một vỏ linux: strace -v -o wget.log -e trace=connect,recv,recvfrom,send,sendto wget http://www.google.com

Kết quả là log file chứa thông điệp như thế này:

  • recv (3, "HTTP/1.0 302 Tìm thấy \ r \ nLocation: htt "..., 511, MSG_PEEK) = 511
  • sendto (4," \ 24 \ 0 \ 0 \ 0 \ 26 \ 0 \ 1 \ 3^\ 206 * J \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 "..., 20, 0, {sa_family = AF_NETLINK, pid = 0, nhóm = 00000000}, 12) = 20

Nhìn vào các trang hướng dẫn sử dụng cho hai cuộc gọi hệ thống này, rõ ràng là 511 và tương ứng 20 là số byte được truyền.Nếu bạn cũng cần thông tin thời gian chi tiết, bạn có thể vượt qua cờ -T để strace:

-T - Thời gian in chi tiêu trong mỗi syscall

Bên cạnh đó, bạn có thể nhận được một số liệu thống kê bằng cách đi qua cờ -c:

-c: Thời gian, cuộc gọi và lỗi cho mỗi hệ thống gọi và báo cáo tóm tắt về chương trình thoát. Trên Linux, điều này cố gắng hiển thị thời gian hệ thống (thời gian CPU dành cho nhân) độc lập với thời gian đồng hồ treo tường. Nếu -c được sử dụng với -f hoặc -F (bên dưới), chỉ tổng hợp tổng số cho tất cả các quy trình truy tìm được lưu giữ.

Nếu bạn cũng cần phải xem xét các dữ liệu thực tế xử lý, bạn có thể muốn nhìn vào specifiers đọc/ghi:

-e đọc = thiết lập: Thực hiện một hệ thập lục phân đầy đủ và ASCII bãi chứa của tất cả dữ liệu được đọc từ tệp mô tả được liệt kê trong tập hợp được chỉ định. Ví dụ: để xem tất cả hoạt động nhập vào tệp mô tả 3 và 5 sử dụng -e read = 3,5. Lưu ý rằng điều này độc lập với việc truy xuất thông thường của cuộc gọi hệ thống đọc (2) được kiểm soát bởi tùy chọn -e trace = read. -e write = set: Thực hiện toàn bộ hệ thập lục phân và ASCII của tất cả dữ liệu được ghi vào tệp các bộ mô tả được liệt kê trong tập hợp được chỉ định. Ví dụ: để xem tất cả hoạt động đầu ra trên tệp mô tả 3 và 5 sử dụng -e write = 3,5. Lưu ý rằng điều này là độc lập với việc truy tìm hệ thống thông thường của cuộc gọi hệ thống ghi (2) được điều khiển bởi tùy chọn -e trace = write.

Bạn cũng có thể tùy chỉnh độ dài tối đa của chuỗi:

strsize -s: Xác định kích thước tối đa chuỗi in (mặc định là 32). Lưu ý rằng tên tập tin không được coi là chuỗi và luôn in đầy đủ

Hoặc đã xâu được đổ như hex:

-XX: In tất cả các chuỗi ở định dạng chuỗi thập lục phân.

Vì vậy, việc sử dụng strace cho phần lớn điều này có vẻ là một cách tiếp cận tốt, vì nó rất dễ thực hiện, nhưng vẫn có một lượng thông tin ở mức thấp. thông tin cấp độ, bạn có thể muốn xem xét mở rộng strace thay vì hoặc nộp yêu cầu tính năng tương ứng với strace project on sourceforge. Tuy nhiên, suy nghĩ một số chi tiết về nó, một cách ít liên quan hơn và nền tảng bất khả thi hơn để thực hiện một điểm chuẩn lưu lượng mạng khá đơn giản, sẽ sử dụng một số hình thức lớp trung gian, giữa khách hàng và máy chủ thực tế: a máy chủ cơ bản đo đếm, phân tích và chuyển hướng lưu lượng truy cập đến máy chủ thực.

Khá giống với máy chủ proxy (ví dụ: SOCKS), để tất cả lưu lượng truy cập đều được truyền qua máy phân tích của bạn, từ đó có thể tích lũy số liệu thống kê và các số liệu khác.

Phiên bản cơ bản của một thứ như thế này có thể dễ dàng kết hợp với nhau bằng cách sử dụng netcat và một số tập lệnh shell, các phiên bản phức tạp hơn có thể được hưởng lợi từ việc sử dụng perl hoặc python.

Để triển khai python của máy chủ SOCKS, bạn có thể muốn xem xét pysocks.

Ngoài ra, có tất nhiên twisted cho python:

Twisted là một công cụ mạng hướng sự kiện được viết bằng Python và được cấp phép theo giấy phép MIT.

Nếu bạn cần có thông tin cấp thấp hơn, có thể bạn sẽ thực sự muốn xem xét chặn cuộc gọi hệ thống.

Nếu bạn cũng cần dữ liệu hiệu quả theo giao thức cụ thể, bạn có thể muốn xem xét tcpdump.

5

Có thể câu trả lời sẽ là sử dụng SystemTap. Trong số các tập lệnh mẫu có nettop hiển thị (một số) thông tin mạng bắt buộc trong kiểu "giống như trên cùng" và có iotime tập lệnh hiển thị thông tin I/O ở biểu mẫu bắt buộc.

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