簡體   English   中英

Linux C套接字數據處理

[英]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是

  1. 我是否必須將數據處理部分與接收數據的線程分開?

  2. 我只是增加do_somthing函數的性能嗎?

您可能有一個基本的設計問題要處理。 傳入的數據快於您可以處理的速度。 如果證明這是短期情況,那么將do_something移動到一個或多個線程並創建處理隊列就足夠了。 但是,請確保您有足夠的緩沖區空間來處理“可證明的”待辦事項。 但是,如果這是一個持續的情況,那么轉移到另一個線程或創建巨大的處理隊列將是不夠的(盡管仍然需要)。 在這種情況下,您需要

  1. 使用流控制減慢/暫停傳入的種子
  2. 使累積的do_something發生的速度快於可能發生的事情

后者不太可能,因此可能需要進行流量控制。 請注意,在某些特定情況下,可以使用丟包的第三種解決方案。 例如,這通常在監視系統的設計中發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM