linux-TCPネットワークインタフェース伝送速度試験プログラム
5432 ワード
ボードのインタフェース通信速度をテストしようとしたが、開発環境に外部ネットワークがないため、既存の各種ツールが使えず、自力更生するしかなかった.だからsocketベースの小さなコードを書いて、みんなと分かち合います.centosとubuntu環境でのコンパイルに成功しました.ps:マルチスレッドを使用しているので、コンパイルは-lpthreadを追加するオプションですよ.
コードリンク:https://github.com/yangyinqi/nic_speed
このようなテストゲートウェイ伝送速度の必要性に対して、比較的純粋な伝送速度を測定する以上、接続はtcp伝送層に直接確立され、様々なアプリケーション層プロトコル解析による遅延を排除する.
サービス側は、リンク層におけるmtuサイズが一般的に1500であることを考慮して、1400の長さで、顧客への接続を継続的に送信するパケットを担当する.各接続上のパケットの合計数を格納するために、先頭ノードの一方向チェーンテーブルを定義し、レートの計算を容易にします.
プライマリ・スレッドでacceptにブロックされ、返されたときにこの接続を維持し、クライアントにデータを送信するスレッドが作成されます.
クライアント処理スレッドは次のとおりです.
レートを計算するスレッドは、スレッド信号量によって応答スレッドの実行ロジックを制御する.具体的には、文章の先頭に接続されているプログラムを参照してください.ここでは具体的なコードは貼られていません.
クライアントの論理は、テスト環境のcpuが8コアであるため、いくつかのスレッド(この例では8)をそれぞれ作成し、スレッドでソケットの作成、connect、recvなどの操作を行うことです.ここでソケットを作成して、複数のスレッドで直接接続することはできません.私はこのエラーを犯しました.このようなサービス側はリンク要求として処理されることに気づきました.
具体的なコードは、文章の先頭githubアドレスを参照します.
帰ってきたらローカルテストを行い、client.hのIPは127.0.0.1に設定され、その後、2つの端末がサーバとクライアントをそれぞれ実行する.
サーバ印刷:
ローカルループネットワークの速度は確かに速いことがわかります.ギガビットカードの実際のテストレートは112 Mb/s程度で、興味のある読者は自分で走りながらテストすることができます.
コードリンク:https://github.com/yangyinqi/nic_speed
このようなテストゲートウェイ伝送速度の必要性に対して、比較的純粋な伝送速度を測定する以上、接続はtcp伝送層に直接確立され、様々なアプリケーション層プロトコル解析による遅延を排除する.
サービス:
サービス側は、リンク層におけるmtuサイズが一般的に1500であることを考慮して、1400の長さで、顧客への接続を継続的に送信するパケットを担当する.各接続上のパケットの合計数を格納するために、先頭ノードの一方向チェーンテーブルを定義し、レートの計算を容易にします.
typedef struct _thread_args {
int client_sockfd;
char *data_pointer;
long packet_count;
int thread_seq;
pthread_t thread_id;
struct _thread_args *next;
}thread_args;
ヘッダノードは、リスニングソケット情報、およびレート計算スレッドの情報を格納する.プライマリ・スレッドでacceptにブロックされ、返されたときにこの接続を維持し、クライアントにデータを送信するスレッドが作成されます.
int thread_seq = 0;
client_len = sizeof(client_address);
while(1) {
printf("Server waiting.
");
client_sockfd = accept(listen_sockfd, (struct sockaddr *)&client_address, &client_len);
if((response_args = (thread_args *)malloc(sizeof(thread_args))) == NULL) {
printf("Thread args malloc failed.
");
close(listen_sockfd);
break;
}
response_args->thread_seq = thread_seq++;
response_args->client_sockfd = client_sockfd;
response_args->packet_count = 0;
response_args->data_pointer = send_buff;
response_args->next = response_head->next;
response_head->next = response_args;
//create thread for send data to client_sockfd
if(pthread_create(&(response_args->thread_id), NULL, thread_response, (void *)response_args) != 0) {
perror("Thread response create failed");
break;
}
}
クライアント処理スレッドは次のとおりです.
void *thread_response(void *arg)
{
thread_args *internal_args = (thread_args *)arg;
internal_args->packet_count = 0;
int sem_status = 0;
pthread_detach(pthread_self());
printf("Server the client,fd:%d. Thread No.%d.
", internal_args->client_sockfd, internal_args->thread_seq);
while(1) {
sem_getvalue(&sem_send_data, &sem_status);
if(sem_status == 0) {
continue;
}
else {
int wr_res = send(internal_args->client_sockfd, internal_args->data_pointer, MTU_NUM, 0);
if(wr_res == 0) {
printf("Disconnected!
");
break;
}
else if(wr_res < 0) {
perror("Error in connection");
break;
}
(internal_args->packet_count)++;
}
}
close(internal_args->client_sockfd);
pthread_exit("");
}
レートを計算するスレッドは、スレッド信号量によって応答スレッドの実行ロジックを制御する.具体的には、文章の先頭に接続されているプログラムを参照してください.ここでは具体的なコードは貼られていません.
クライアント:
クライアントの論理は、テスト環境のcpuが8コアであるため、いくつかのスレッド(この例では8)をそれぞれ作成し、スレッドでソケットの作成、connect、recvなどの操作を行うことです.ここでソケットを作成して、複数のスレッドで直接接続することはできません.私はこのエラーを犯しました.このようなサービス側はリンク要求として処理されることに気づきました.
具体的なコードは、文章の先頭githubアドレスを参照します.
テスト:
帰ってきたらローカルテストを行い、client.hのIPは127.0.0.1に設定され、その後、2つの端末がサーバとクライアントをそれぞれ実行する.
サーバ印刷:
Server waiting.
Server the client,fd:5. Thread No.1.
Server waiting.
Server the client,fd:6. Thread No.2.
Server the client,fd:4. Thread No.0.
Server waiting.
Server waiting.
Server waiting.
Server the client,fd:7. Thread No.3.
Server the client,fd:8. Thread No.4.
Server the client,fd:9. Thread No.5.
Server waiting.
Server waiting.
Server the client,fd:10. Thread No.6.
Server the client,fd:11. Thread No.7.
No.7 client count packet:1516597.
No.6 client count packet:1486722.
No.5 client count packet:1494818.
No.4 client count packet:1522742.
No.3 client count packet:1541814.
No.2 client count packet:1405446.
No.1 client count packet:1586907.
No.0 client count packet:1598772.
Total length:12153818bytes. Sample timing:5s, Transmittion speed:3245.42Mb/s
No.7 client count packet:2625885.
No.6 client count packet:2658081.
No.5 client count packet:2788680.
No.4 client count packet:2387941.
No.3 client count packet:2776665.
No.2 client count packet:2514184.
No.1 client count packet:2648765.
No.0 client count packet:2461294.
Total length:20861495bytes. Sample timing:5s, Transmittion speed:5570.62Mb/s
No.7 client count packet:2431768.
No.6 client count packet:2388140.
No.5 client count packet:2415890.
No.4 client count packet:2329173.
No.3 client count packet:2550932.
No.2 client count packet:2524958.
No.1 client count packet:2492313.
No.0 client count packet:2537837.
Total length:19671011bytes. Sample timing:5s, Transmittion speed:5252.73Mb/s
No.7 client count packet:1855025.
No.6 client count packet:1954570.
No.5 client count packet:1929904.
No.4 client count packet:1898067.
No.3 client count packet:2134070.
No.2 client count packet:1930880.
No.1 client count packet:1965562.
No.0 client count packet:1834356.
Total length:15502434bytes. Sample timing:5s, Transmittion speed:4139.60Mb/s
クライアント印刷:Creating thread..
Connect successfully,seq_num:3, id:-1562437888
Connect successfully,seq_num:5, id:-1587616000
Connect successfully,seq_num:4, id:-1570830592
Connect successfully,seq_num:5, id:-1596008704
Connect successfully,seq_num:6, id:-1604401408
Thread create finished. Test running...
Connect successfully,seq_num:5, id:-1579223296
Connect successfully,seq_num:8, id:-1621186816
Connect successfully,seq_num:8, id:-1612794112
Main process.
ローカルループネットワークの速度は確かに速いことがわかります.ギガビットカードの実際のテストレートは112 Mb/s程度で、興味のある読者は自分で走りながらテストすることができます.