存储套接字信息随机访问速度

Storing Socket Information Random Access Speed

本文关键字:访问 速度 随机 信息 套接字 存储      更新时间:2023-10-16

现状:我有一个linux服务器(用于与陌生人聊天),我有一个关于效率的问题。

目前我在一个简单的管理器类中使用一个地图来配对两个陌生人:

int sockManager::set_pair(int me, int them) {
 if (them != -1) {
    pairs[me] = them;
    pairs[them] = me;
    return 1;
 }
 return -1;
}
int sockManager::get_pair(int me) {
 return pairs[me];
}
void sockManager::add_single(int me) {
 pairs[me] = -1;
}
void sockManager::remove_single(int me) {
 if (pairs[me] != -1)
    pairs[pairs[me]] = -1;
 pairs.erase(me);
}
int sockManager::find_unconnected(int me) {
 if (pairs[me] != -1)
 return pairs[me];
 for (iter = pairs.begin();iter!=pairs.end();iter++){
  if (iter->second == -1 && iter->first != me)
  return iter->first;
 }
 return -1;
}
int sockManager::get_size(){
 return pairs.size();
}
我使用这个管理器类的原因是为了可扩展性。例如,现在我想改变我寻找两个客户端连接的方式。我想要一个"需要联系"标志,和一个简单的线程,不断运行,并找到客户端连接,当客户端不能连接,如果时间已经超过x秒,给他们一个有趣的说法或东西(让他们娱乐),我还需要确保客户端没有连接到与他们相同的IP地址的人…

问题来了:我使用映射来存储每个套接字及其对应的伙伴。是否有另一种更快的方式来存储每个套接字和伙伴组合?(对于随机访问,例如查找int[socket]的速度与map方法的速度。){是否使用结构体数组对是我最初的问题,然后我意识到这将是愚蠢的方式…文件描述符并不是每次递增1,所以认为数组可以加快速度是完全没用的}

主观(ish)问题:我想为每个连接存储标志,你认为最好和最容易扩展的方法是将映射对的值(而不是键)转换为持有必要信息的结构体(合作伙伴套接字,连接标志,标志…)还是我应该制作另一个地图,特别是标志成员作为值?内存不是问题。

第三更坚固[&&问题:我正在使用select()函数的FD_Set,并且我已经读到它非常慢,有大量的FD(我知道它可以处理最多1024个,但同样适用于poll())。我该如何实现一个基于事件的系统来监听来自用户的传入数据?(操作系统:ubuntu linux)和它会快多少?我已经对我的服务器进行了压力测试,我可以在网络上处理几百个客户端,而用户端没有明显的减速。我想一次支持3000人以上。

比起花上几个小时读材料,我通过问问题和意识到我将要问多少愚蠢的问题来了解更多…

我将如何去实现一个监听的基于事件的系统来自用户的传入数据?(ubuntu操作系统:linux)和它会快多少?我已经对我的服务器进行了压力测试我能应付几百个跨网络的客户端没有用户的速度明显减慢的一面。我想支持向上的

通常,试图解决c10k问题的人将使用libevent或MTasker提供的事件处理循环。线程化通常会让您在不太麻烦的情况下获得几百个内存,但在某些情况下,内存使用会变得非常受限。基于事件的编程通常可以让服务器扩展到数千台,但这取决于许多因素。