Каковы ограничения потока при работе в Linux по сравнению с процессами для приложений, связанных с сетью / вводом-выводом? - PullRequest
28 голосов
/ 31 августа 2010

Я слышал, что в Linux на многоядерном сервере было бы невозможно достичь максимальной производительности, когда у вас всего 1 процесс, но несколько потоков, потому что Linux имеет некоторые ограничения на ввод-вывод, так что 1 процесс с 8 потоками на 8-ядерномСервер может работать медленнее, чем 8 процессов.

Есть комментарии?Существуют ли другие ограничения, которые могут замедлить работу приложений?Это сетевое приложение C ++, обслуживающее сотни клиентов с некоторым дисковым вводом-выводом.

Обновление: Я обеспокоен тем, что существуют и другие проблемы, связанные с вводом-выводом, помимо реализации блокировки, которую я реализуюсам ... Нет ли проблем с одновременным вводом / выводом из сети / диска в несколько потоков?

Ответы [ 2 ]

62 голосов
/ 14 сентября 2010

Недостатки потоков

Тема:

  • Сериализация операций с памятью. Это ядро, и, в свою очередь, MMU должен обслуживать такие операции, как mmap(), которые выполняют распределение страниц.
  • Совместно использовать одну и ту же таблицу дескрипторов файлов. Существует блокировка, связанная с внесением изменений и выполнением поиска в этой таблице, в которой хранятся такие вещи, как смещения файлов и другие флаги. Каждый системный вызов, использующий эту таблицу, такой как open(), accept(), fcntl(), должен блокировать ее для перевода fd во внутренний дескриптор файла и при внесении изменений.
  • Поделиться некоторыми атрибутами планирования. Процессы постоянно оцениваются, чтобы определить нагрузку на систему, и соответственно планируются. Множество потоков подразумевает более высокую загрузку ЦП, которая обычно не нравится планировщику, и это увеличит время ответа на события для этого процесса (например, чтение входящих данных в сокете).
  • Может делиться некоторой доступной для записи памятью. Любая память, записываемая несколькими потоками (особенно медленная, если для этого требуется причудливая блокировка), вызовет все виды конфликтов в кэш-памяти и сопутствующих проблем. Например, операции с кучей, такие как malloc() и free(), работают с глобальной структурой данных (что в некоторой степени можно обойти). Есть и другие глобальные структуры.
  • Совместное использование учетных данных, это может быть проблемой для процессов типа службы.
  • Обмен обработкой сигналов, они прервут весь процесс, пока они обрабатываются.

Процессы или потоки?

  • Если вы хотите упростить отладку, используйте потоки.
  • Если вы работаете в Windows, используйте темы. (Процессы в Windows чрезвычайно тяжелые).
  • Если стабильность является огромной проблемой, попробуйте использовать процессы. (Один SIGSEGV/PIPE это все, что нужно ...).
  • Если потоки недоступны, используйте процессы. (Сейчас это не так часто, но это случилось).
  • Если ваши потоки совместно используют ресурсы, которые нельзя использовать из нескольких процессов, используйте потоки. (Или предоставьте механизм IPC для связи с потоком «владельца» ресурса).
  • Если вы используете ресурсы, которые доступны только для каждого процесса (и один для контекста), очевидно, используйте процессы.
  • Если ваши контексты обработки не имеют абсолютно ничего общего (например, сервер сокетов, который порождает и забывает соединения при их accept() s), а ЦП является узким местом, используйте процессы и однопоточные среды выполнения (которые лишены всех видов интенсивной блокировки, например, в куче и других местах).
  • Одно из самых больших различий между потоками и процессами заключается в следующем: потоки используют программные конструкции для защиты структур данных, процессы используют аппаратные средства (что на значительно быстрее).

Ссылки

0 голосов
/ 31 августа 2010

это действительно не должно иметь никакого значения, но, вероятно, это касается дизайна.

Многопроцессорное приложение может потребовать меньше блокировок, но может использовать больше памяти.Обмен данными между процессами может быть сложнее.

С другой стороны, многопроцессорность может быть более надежной.Вы можете вызвать exit () и безопасно выйти из ребенка, не затрагивая других.

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

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