Нагрузочное тестирование многопоточной системы по сравнению с использованием отдельных процессов - почему многопоточная версия намного быстрее? - PullRequest
3 голосов
/ 05 июля 2011

Я работаю в системе, в которой взаимодействуют три компонента высокого уровня

Клиент (PHP) - Logger (Java) - MainBackend (Java)

Клиент PHP создает новый процесс Linux Logger для каждого полученного запроса. Затем регистратор отправляет сообщение по TCP в MainBackend и начинает регистрировать сообщения, которые он получает от MainBackend. Обратите внимание, что Logger очень легкий и использует очень мало памяти.

Я проверил нагрузку на эту систему, увеличив число пользователей N, обращающихся к системе. Затем я написал версию, в которой Logger был многопоточным, так что для каждого N одновременных пользователей использовался только один процесс, и протестировал нагрузочную версию многопоточной версии.

В результате многопоточная версия была на FAR быстрее, как в во многих раз быстрее определенного N. Мой вопрос - почему?

Если для запуска каждого процесса Linux требуется определенное время T, почему я не вижу постоянной разницы (T2 - T1) между двумя графиками?

Является ли Linux просто менее эффективным в планировании процессов, чем Java в планировании потоков?

РЕДАКТИРОВАТЬ: Важным моментом, который я не упомянул, является то, что все время было выполнено из Logger, поэтому время запуска процесса / виртуальной машины не влияет на результаты - я провел эксперимент таким образом, чтобы как можно меньше переменных.

Ответы [ 3 ]

1 голос
/ 05 июля 2011

JVM выполняет оптимизацию во время выполнения, особенно для кода, выполняемого повторно. Это займет некоторое время, период разогрева. Результат может быть безумно быстрее. Вы можете время от времени выполнять свою задачу в одной и той же виртуальной машине, вы увидите, что она медленная в начале, но в конце становится намного быстрее.

Если вы запускаете новый процесс JVM для каждой небольшой задачи, оптимизация не запускается до завершения работы JVM.

0 голосов
/ 05 июля 2011

Речь идет не только о времени создания процесса или потока, но и о переключении контекста. Вы можете найти некоторые номера здесь: http://wiki.osdev.org/Context_Switching, http://en.wikipedia.org/wiki/Context_switch.

Короче говоря, структура с информацией о процессе больше, чем структура с данными о потоке.

0 голосов
/ 05 июля 2011

Процессы тяжелее, чем нити. Использовать существующий процесс или существующее TCP-соединение намного быстрее, чем каждый раз создавать новое. Это верно для всех операционных систем. Вы можете создавать процессы или соединения только по требованию, если производительность не является для вас проблемой.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...