Я пишу TCP-сервер на Windows Server 2k8.Эти серверы получают данные, анализируют их и затем помещают в базу данных.Сейчас я делаю некоторые тесты, но результаты меня удивляют.
Приложение написано на C ++ и использует напрямую Winsocks и Windows API.Он создает поток для каждого клиентского соединения.Для каждого клиента он читает и анализирует данные, а затем вставляет их в базу данных.
Клиенты всегда подключаются одновременно:время от времени около 5 (я контролирую этот параметр) клиентов будут одновременно подключаться и подавать данные серверу.
Я синхронизировал этапы чтения и синтаксического анализа, а также связанные с базой данных этапы каждого из них.thread.
Первый этап (чтение и анализ) имеет любопытное поведение.Количество времени, которое занимает каждый поток, примерно равно каждому потоку, но также пропорционально количеству соединяющихся потоков.Сервер не истощен ЦП: у него 8 ядер, и к нему всегда подключено менее 8 потоков.
Например, при трех одновременных потоках 100 тыс. Строк (для каждого потока) будут считываться и анализироваться примерно за 4,5 с.Но с 5 потоками это займет в среднем 9,1 с!
Мой друг предположил, что такое поведение масштабирования может быть связано с тем, что я использую блокирующие сокеты.Это правильно?Если нет, то в чем может быть причина такого поведения?
Если это так, я был бы рад, если бы кто-то указал мне хорошие ресурсы для понимания неблокирующих сокетов в Windows.
Редактировать :
Каждый клиентский поток читает строку (т. Е. Все символы до '\ n') из сокета, затем анализирует ее, затем снова читает, до тех пор, пока анализ не завершится илитерминатор найденМоя подпрограмма readline основана на этом:
http://www.cis.temple.edu/~ingargio/cis307/readings/snaderlib/readline.c
Со статическими переменными, объявленными как __declspec (thread).
Синтаксический анализ, исходя из не сетевой версии,эффективен (около 2 с для 100 тыс. строк).Поэтому я предполагаю, что проблема в многопоточной / сетевой версии.