1

我的套接字服务器每秒接收超过 5,000 个数据包,数据将保存到数据库中。

问题是处理数据(调用存储过程,选择一些行..)到数据库比从套接字接收数据慢。结果,套接字接收缓冲区结束后,套接字无法接收所有数据。

简单的例子在这里。

do_something(char *buf, char *res) {

/*
call some database stored procedures and get the result
this part makes bottle neck.
*/

}

接收数据(..) {

而(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 */
            }
        }
    }
}

}

我的问题是

  1. 我必须将数据处理部分与接收数据分开吗?

  2. 我只是增加 do_somthing 函数的性能吗?

4

1 回答 1

2

您可能有一个基本的设计问题需要处理。传入的数据比您处理它的速度要快。如果可以证明这是一种短期情况,那么将 do_something 移动到一个或多个线程并创建一个处理队列可能就足够了。不过,请确保您有足够的缓冲区空间来处理“可证明的”积压工作。但是,如果这是一个持续的情况,那么移动到另一个线程或创建一个巨大的处理队列将是不够的(尽管仍然需要)。在这种情况下,您需要

  1. 使用流量控制减慢/暂停传入的 torrent
  2. 使累积的 do_something 发生的速度比事情可能进来的速度更快

后者不太可能,因此可能需要流量控制。请注意,在某些特定情况下,可以使用第三种丢弃数据包的解决方案。这经常发生在监控系统的设计中(例如)。

于 2013-11-14T04:18:32.940 回答