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.
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
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. –
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