Вы косяк процесса больше запросов, чем вы ядра процессора. «Быстрые» масштабируемые решения включают в себя создание пулов потоков, где количество активных (не заблокированных в IO) потоков - количество ядер ЦП. Таким образом, создание 100 потоков, потому что вы хотите обслуживать 100 мсqq запросов, не является хорошим дизайном.
В Windows есть механизм объединения потоков, который называется IO Completion Ports.
Использование портов ввода-вывода ввода-вывода делает проект единым процессом, так как в многопроцессорном дизайне каждый процесс будет иметь свой собственный пул потоков ввода-вывода IO, который будет управляться независимо, и, следовательно, вы можете получить гораздо больше потоков для ядер процессора.
«Ядро» идея ввода-вывода ввода-вывода заключается в том, что его очередь режима ядра - вы можете вручную отправлять события в очередь или получать асинхронные завершения ввода-вывода, отправленные в нее автоматически, связывая файл (файл, сокет, обрабатывает порт.
С другой стороны, механизм ввода-вывода IO автоматически деактивирует события на потоках ожидающих работников, но он НЕ отменяет задания, если обнаруживает, что текущие «активные» потоки в пуле потоков> = количество ядер ЦП.
Использование портов ввода-вывода IO может потенциально значительно увеличить масштабируемость службы, обычно выигрыш намного меньше, чем ожидалось, поскольку другие факторы быстро вступают в игру, когда все ядра процессора конкурируют за другие сервисы.
Если ваши службы разработаны на языке C++, вы можете обнаружить, что сериализованный доступ к куче большой минус производительности - хотя Windows версии 6.1, похоже, реализовала низкую кучу соперников, поэтому это может быть меньше проблемы.
Подводя итог - теоретически ваш самый большой прирост производительности будет за счет разработки пулов потоков, управляемых одним процессом. Но вы сильно зависите от библиотек, которые используете, чтобы не сериализовать доступ к критическим ресурсам, что может быстро избавить вас от всех теоретических показателей производительности. Если у вас есть код библиотеки, сериализующий вашу службу с хорошим потоком (как в случае создания объекта C++ & уничтожение происходит из-за конфликта кучи), тогда вам нужно изменить использование библиотеки/переключателя на низкоконфликтную версию библиотеки или просто масштабировать до нескольких процессов.
Единственный способ узнать - написать тестовые примеры, которые различают сервер по-разному и измерять результаты.
Да, мы столкнулись с этим. база данных является основным узким местом. никого не обидеть, но у нас была намного лучшая производительность с оракулом по сравнению с sql-сервером. но здесь, в нашем регионе, большинство наших клиентов придерживаются sql-сервера (менее дорогостоящего), что является настоящей бутылочной горловиной для нас. –