2008-10-28 25 views
6

Để kiểm tra tải ứng dụng của tôi (dưới Linux), tôi đang tìm một công cụ xuất dữ liệu ở chế độ stdout với tốc độ cụ thể (như 100 byte/s), để tôi có thể đầu ra cho netcat gửi nó đến ứng dụng của tôi. Một số tùy chọn cho dd sẽ là lý tưởng, nhưng tôi đã không tìm thấy bất cứ điều gì cho đến nay. Nó không thực sự quan trọng loại dữ liệu được in (NUL byte là OK). Bất kỳ gợi ý nào?làm đầu ra stdout với tốc độ cụ thể

+0

Một phóng viên đã nhận xét với tôi rằng việc sử dụng đường ống vào netcat có thể có nghĩa là đường ống có thể là một yếu tố hạn chế. Do đó, nó đáng tin cậy hơn để ghi trực tiếp vào ổ cắm theo tỷ lệ bạn tìm kiếm. –

Trả lời

3

Tôi nghĩ rằng đây là những gì bạn thực sự muốn: Pipe Viewer

Sử dụng <fast input> | pv -qL <rate>[k|m|g|t] | <rate-limited output> sẽ giới hạn đường ống theo tỷ lệ được yêu cầu.

2

Nếu bạn ổn khi nhận được tất cả hàng trăm byte tại một thời điểm, bạn có thể thực hiện một vòng lặp với sleep và đồng bằng cũ echo trong vỏ làm nỗ lực đầu tiên ít nhất.

+0

ý tưởng hay - giống như "trong khi [true]; làm echo -n" 1234567890 "; chúng tôi ngủ 10000; đã hoàn thành" đã hoạt động. – oliver

0

Vâng, hiện tại tôi đang sử dụng nuttcp để thực hiện các kiểm tra tải "thực". Nó có vẻ có chi phí khá thấp, do đó hệ thống kiểm tra không quá bị xáo trộn.

5

Tôi đã viết một chương trình nhanh có một đối số, số lượng A ký tự để in thành đầu ra tiêu chuẩn mỗi giây (đối số phủ định có nghĩa là không giới hạn tốc độ). Hi vọng điêu nay co ich! :-) (Trên GNU libc, bạn sẽ cần phải liên kết chương trình của bạn với -lrt.)

Chỉnh sửa: sửa đổi dấu chấm theo mặc định, trong trường hợp ký tự đầu tiên được sử dụng. (Điều đó có nghĩa, nếu bạn muốn in các ký tự NUL, chỉ cần chỉ định một chuỗi rỗng như là đối số thứ hai :-).)

#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <unistd.h> 

int 
sleeptill(const struct timespec *when) 
{ 
    struct timespec now, diff; 

    clock_gettime(CLOCK_REALTIME, &now); 
    diff.tv_sec = when->tv_sec - now.tv_sec; 
    diff.tv_nsec = when->tv_nsec - now.tv_nsec; 
    while (diff.tv_nsec < 0) { 
     diff.tv_nsec += 1000000000; 
     --diff.tv_sec; 
    } 
    if (diff.tv_sec < 0) 
     return 0; 
    return nanosleep(&diff, 0); 
} 

int 
main(int argc, char **argv) 
{ 
    double rate = 0.0; 
    char *endp; 
    struct timespec start; 
    double offset; 

    if (argc >= 2) { 
     rate = strtod(argv[1], &endp); 
     if (endp == argv[1] || *endp) 
      rate = 0.0; 
     else 
      rate = 1/rate; 

     if (!argv[2]) 
      argv[2] = "."; 
    } 

    if (!rate) { 
     fprintf(stderr, "usage: %s rate [char]\n", argv[0]); 
     return 1; 
    } 

    clock_gettime(CLOCK_REALTIME, &start); 
    offset = start.tv_nsec/1000000000.0; 

    while (1) { 
     struct timespec till = start; 
     double frac; 
     double whole; 

     frac = modf(offset += rate, &whole); 
     till.tv_sec += whole; 
     till.tv_nsec = frac * 1000000000.0; 
     sleeptill(&till); 
     write(STDOUT_FILENO, argv[2], 1); 
    } 
} 
+1

Với bản sửa đổi mới nhất, bây giờ bạn có thể chỉ định 0 là tỷ lệ. Về mặt kỹ thuật, nó không chờ đợi "mãi mãi" (như nó phải, toán học); thay vào đó, nó đợi cho đến khi kết thúc time_t (tháng 1 năm 2038, trên nền tảng với time_t 32 bit). Vẫn còn khá lâu để chờ đợi. :-D –

+0

Nội dung hay - cảm ơn! Làm thế nào về việc đưa nó lên trên một số trang web kiểm soát sửa đổi (github, launchpad, sourceforge ...) để mọi người có thể thêm thay đổi? Ngoài ra, tôi nghĩ rằng để thực hiện nó sẽ hữu ích để viết() một khối toàn bộ dữ liệu cùng một lúc. – oliver

+0

Tôi cố tình sử dụng write() không có bộ đệm để dữ liệu được đảm bảo đạt tốc độ không đổi. Để sử dụng bộ đệm, hãy thay đổi lệnh write() thành putchar (* argv [2]). :-) Tôi sẽ xem những gì tôi có thể làm về kiểm soát sửa đổi công cộng .... –

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