私のソケット サーバーは 1 秒間に 5,000 を超えるパケットを受信し、データはデータベースに保存されます。
問題は、データベースへのデータの処理 (ストアド プロシージャの呼び出し、行の選択など) が、ソケットからデータを受信するよりも遅いことです。その結果、ソケットの受信バッファがオーバーしているため、ソケットはすべてのデータを受信できません。
簡単な例はここにあります。
do_something( char *buf, char *res ) {
/*
call some database stored procedures and get the result
this part makes bottle neck.
*/
}
recv_data( .. ) {
ながら(1) {
n = epoll_wait( efd, events, EPOLL_SIZE, -1 );
if( -1 == n ) {
perror( "epoll wait error" );
}
for( i=0; i<n; i++ ) {
if( events[i].data.fd == sfd ) {
/* accept code */
} else {
memset( buf_in, 0x00, 256 );
readn = read( events[i].data.fd, buf_in, 255 );
if( readn <= 0 ) {
/* close connection */
} else {
do_something( buf_in, result ); /* the function treats data into dbms */
write( events[i].data.fd, res, 255 ); /* ack the result */
}
}
}
}
}
私のクエストは
受信データとは別のスレッドでデータ処理部分を分離する必要がありますか?
do_somthing 関数のパフォーマンスを向上させるだけですか?