[英]Linux c socket data handling
我的套接字服務器在一秒鍾內接收到超過5,000個數據包,數據將保存到數據庫中。
問題在於,處理數據(調用存儲過程,選擇某一行..)到數據庫中比從套接字接收數據要慢。 結果,如果套接字接收緩沖區結束,套接字將無法接收所有數據。
簡單的例子在這里。
do_something(char * buf,char * res) {
/*
call some database stored procedures and get the result
this part makes bottle neck.
*/
}
recv_data(..) {
while(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 */
}
}
}
}
}
我的questinos是
我是否必須將數據處理部分與接收數據的線程分開?
我只是增加do_somthing函數的性能嗎?
您可能有一個基本的設計問題要處理。 傳入的數據快於您可以處理的速度。 如果證明這是短期情況,那么將do_something移動到一個或多個線程並創建處理隊列就足夠了。 但是,請確保您有足夠的緩沖區空間來處理“可證明的”待辦事項。 但是,如果這是一個持續的情況,那么轉移到另一個線程或創建巨大的處理隊列將是不夠的(盡管仍然需要)。 在這種情況下,您需要
后者不太可能,因此可能需要進行流量控制。 請注意,在某些特定情況下,可以使用丟包的第三種解決方案。 例如,這通常在監視系統的設計中發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.