Хранение информации о сокете Скорость произвольного доступа - PullRequest
1 голос
/ 05 мая 2011

Текущая ситуация: у меня настроен сервер 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 [сокет] против метода карты.) {Было ли моим первоначальным вопросом использование массива структур для пар, тогда я понял, что это будет глупо ... Файловые дескрипторы не увеличиваются на 1 каждый раз, поэтому было бы совершенно бесполезно думать, что массив ускорит процесс до}

Субъективный (иш) вопрос: Я хотел бы хранить флаги для каждого соединения. Как вы думаете, лучший и наиболее легко расширяемый метод состоит в том, чтобы превратить значение (в отличие от ключа) пары карт в структуру, содержащую необходимую информацию (сокет партнера, флаг для подключения , flag to ...) или я должен создать другую карту, в которой в качестве значения будут указаны члены флага? Память не будет проблемой.

Третий более солидный [&& слегка не связанный] вопрос: Я использую FD_Set с функцией select (), и я прочитал, что он довольно медленный с большим количеством FD (я знаю, что он может обрабатывать максимум 1024, но то же самое относится и к poll ()). Как мне поступить? внедрение системы на основе событий для прослушивания входящих данных от пользователей? (OS: Ubuntu Linux) и насколько это будет быстрее? Я стресс-тестировал свой сервер как есть, и я могу обрабатывать несколько сотен клиентов по всей сети без заметного замедления на стороне пользователя. Я бы хотел поддержать до 3к одновременно.

Я понял больше, задав вопрос и осознав, сколько глупых вопросов я собирался задать, чем часами читать материал ...

1 Ответ

2 голосов
/ 05 мая 2011

Как мне реализовать систему на основе событий для прослушивания входящих данных от пользователей?(OS: Ubuntu Linux) и насколько это будет быстрее?Я стресс-тестировал свой сервер как есть, и я могу обрабатывать несколько сотен клиентов по всей сети без заметного замедления на стороне пользователя.Я бы хотел поддерживать до 3 тыс. Одновременно.

Обычно люди, пытающиеся решить проблему c10k , будут использовать цикл обработки событий, предоставленный libevent или MTasker .Многопоточность, как правило, приводит вас к малым сотням без особых хлопот, но в какой-то момент использование памяти становится очень ограниченным.Программирование на основе событий обычно позволяет масштабировать серверы до тысяч, но это зависит от многих факторов.

...