Почему использование большего количества потоков делает его медленнее, чем использование меньшего количества потоков

Если Вы хотите способ перезагрузить, не сохраняя открытые документы, но не поражая кнопку сброса, то существуют пути, которые, менее вероятно, вызовут потерю данных. Во-первых, попробуйте Ctrl+Alt+F1. Это должно принести Вам к виртуальной консоли, как сказал ixtmixilix. После того как Вы находитесь в виртуальной консоли, Ctrl+Alt+Delete закроет и перезагрузит машину.

Если та техника не работает, всегда существует Alt+SysRq+REISUB.

Что касается решения проблемы без перезагрузки, без большей информации о том, что продолжается, было бы трудно дать хороший ответ. Если Вы могли бы описать обстоятельства, при которых это происходит (лучший способ сделать, который должен отредактировать Ваш вопрос добавить информацию), то это может помочь людям дать хорошие ответы. Другая вещь рассмотреть состоит в том, что, если Ваш компьютер становится безразличным - особенно, если он берет больше, чем несколько секунды для Ctrl+Alt+F1 для перевода в рабочее состояние виртуальной консоли - затем, у Вас почти наверняка есть ошибка, и путем создания отчетов об этом можно и помочь сообществу и возможно получить ответ.

Незначительные сбои GUI, вызывающие безразличный WM или X11/Wayland

Это могло бы происходить из-за взаимодействия между приложением и менеджером окон - или сервер X11 или Уэйленд. Знак, что это - природа проблемы, состоит в том, если приложение прекращает отвечать и препятствует тому, чтобы Вы ввели вход с клавиатурой или мышью к другим окнам приложения. (Никакое приложение не должно мочь сделать это; некоторый компонент графического интерфейса пользователя должен иметь ошибку в нем, чтобы это произошло.), Если это - то, что происходит, затем можно уничтожить незаконный процесс в виртуальной консоли (поскольку ixtmixilix сослался на):

  1. Нажмите Ctrl+Alt+F1.

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

  3. Используйте утилиту как ps выяснять незаконное имя процесса программы. Иногда это легко в Ubuntu, и другие времена, которые это не. Например, название процесса менеджера Архива file-roller. При наличии затруднений при понимании этого можно обычно находить информацию онлайн без слишком большой проблемы (или если Вы не можете, можно отправить вопрос об этом).

    Можно передать по каналу psвывод к grep сужать вещи. Предположим, что это был менеджер Архива, который вызывал проблему. Затем Вы могли работать:

    ps x | grep file-roller
    

    Вы будете видеть запись для своего собственного grep команда, плюс запись для file-roller.

  4. Попытайтесь уничтожить незаконный процесс с SIGTERM. Это дает ему шанс сделать очистку на последней минуте как сбрасывание буферов файлов, передача сигналов удаленным серверам, что это собирается разъединиться (для протоколов, которые делают это), и выпуск других видов ресурсов. Чтобы сделать это, используйте kill команда:

    kill PID

    где PID Идентификационный номер процесса процесса, который Вы хотите уничтожить, полученный из выполнения ps на шаге 3.

  5. SIGTERM способ твердо попросить, чтобы процесс вышел. Процесс может проигнорировать тот сигнал и сделает так при неправильном функционировании при определенных обстоятельствах. Таким образом, необходимо проверить, чтобы видеть, что это работало. Если это не сделало, уничтожьте его с SIGKILL, который это не может проигнорировать, и который всегда работает кроме редкого случая, где процесс находится в бесперебойном сне (или если это действительно не работает, но является скорее процессом-зомби).

    Можно и проверить, чтобы видеть, работает ли процесс все еще, и уничтожьте его с SIGKILL если это со всего одной командой:

    kill -KILL PID

    Если Вы получаете сообщение как kill: (PID) - No such process, Вы знаете уничтожение его с SIGTERM обработанный. Если Вы не получаете вывода, Вы знаете SIGTERM не работал. В этом случае, SIGKILL вероятно, сделал, но стоит проверить выполнение его снова. (Нажмите клавишу со стрелкой вверх для перевода в рабочее состояние предыдущих команд, для простоты ввода.)

  6. В редких экземплярах для Ваших собственных процессов, или всегда с процессами, принадлежащими root или другой пользователь помимо себя, необходимо уничтожить процесс как root. Чтобы сделать это, предварительно ожидать sudo (включая конечный пробел) перед вышеупомянутым kill команды. Если вышеупомянутые команды не работают, или Вам говорят, что Вы не имеете необходимого доступа для уничтожения процесса, пробуете его как root с sudo.

(Между прочим, kill -KILL совпадает с широко популярным kill -9. Я рекомендую kill -KILL потому что SIGKILL как гарантируют, не будет иметь 9 как его число сигнала на всех платформах. Это работает над x86, но это не означает, что будет обязательно работать везде. Таким образом, kill -KILL более вероятно, успешно закончит процесс, чем kill -9. Но они эквивалентны на x86, поэтому не стесняйтесь использовать его там, если Вам нравится.)

Если Вы знаете, что нет никаких других процессов с тем же именем как то, которое Вы хотите уничтожить, можно использовать killall вместо kill и название процесса вместо Идентификационного номера процесса.

Процесс, монополизирующий ресурсы ЦП

Если процесс работает в или очень около максимально возможного приоритета (или указывать это более правильно, в или около самой низкой правильности), он мог потенциально представить Ваш графический интерфейс пользователя полностью, или почти полностью, безразличный. Однако в этой ситуации, Вы, вероятно, не смогли бы переключиться на виртуальную консоль и команды выполнения (или возможно даже перезагрузка).

Если процесс или комбинация процессов, работающих в нормальном или умеренно поднятом приоритете, замедляют Вашу машину, необходимо смочь уничтожить их использующий технику в разделе выше. Но если они - графические программы, можно, вероятно, также уничтожить их путем нажатия близкой кнопки на их окнах - настольная среда даст Вам опцию уничтожить их, если они не ответят. Если это не работает, конечно, можно (почти) всегда уничтожать их с kill -KILL.

Проблемы ввода-вывода

Ошибочный ввод-вывод может вызвать продленный (даже бесконечный) безразличность. Это может произойти из-за ошибки ядра и/или ошибочных драйверов. Частичное обходное решение должно избежать тяжелых и одновременных операций чтения и/или операций записи (например, не копируйте два больших файла сразу в двух одновременных процессах копии; не копируйте большой файл при наблюдении HD-видео или установке ОС в виртуальной машине).

Это очевидно неудовлетворительно, и действительное решение состоит в том, чтобы найти проблему и сообщить об этом. Если Вы не выполняете ядро магистрали из kernel.org, об ошибках ядра нужно сообщить против пакета linux в Ubuntu (так как Ubuntu дает специальные сборки ядра, которые интегрируют определенные для дистрибутива патчи и отчеты об ошибках, не подтвержденные против ядра магистрали, будет отклонен по kernel.org). Необходимо сделать это путем выполнения ubuntu-bug linux (или apport-cli linux) на затронутой машине. Посмотрите, что ошибка Ubuntu сообщает о документации сначала; это объясняет, как сделать это правильно.

Проблемы с видеокартой

Некоторые тупики GUI могут быть вызваны проблемами с видеокартой. Существует несколько вещей, которые можно попробовать, для облегчения этого:

  1. Ищите сеть, чтобы видеть, испытали ли другие люди подобные проблемы с той же видеокартой (и/или сделайте и модель машины) на Ubuntu или другом GNU/дистрибутивах Linux. Могут быть решения, более конкретные, чем, что я могу предложить в этом ответе без более определенной информации, чем в настоящее время находится в Вашем вопросе.

  2. Посмотрите, доступны ли различные видеодрайверы для Вас для попытки. Можно сделать это путем регистрации в Дополнительных Драйверах; можно также искать сеть для наблюдения, какие драйверы Linux доступны для видеокарты. Большинством собственных видеокарт является Intel, AMD/ATi или Nvidia (нажмите на те ссылки для наблюдения общественной документации относительно установки и использования собственных драйверов для этих карт в Ubuntu). Для Intel Вы являетесь лучшими от того, чтобы придерживаться драйверов FOSS, которые присутствуют в Ubuntu, но существует все еще полезная информация, которую можно использовать. Независимо от того, какую карту Вы имеете, эта общая информация может помочь.

    При текущем использовании собственных драйверов можно попытаться использовать различные собственные драйверы (например, непосредственно от Nvidia или AMD/ATi), или можно попытаться использовать бесплатные драйверы с открытым исходным кодом вместо этого.

  3. Попытайтесь выбрать графический тип сессии входа в систему, который не требует/использует графического ускорения. Чтобы сделать это, выйдите из системы, и на графическом входе в систему экран нажимает логотип Ubuntu или значок механизма около Вашего имени для входа в систему. Выпадающее меню показывают. Измените выбор от Ubuntu до Ubuntu 2D. Это заставляет Вас использовать Единицу, 2D вместо Единицы. (При использовании GNOME Shell можно выбрать Нейтрализацию GNOME / Классик GNOME вместо этого.), Если в сомнении и существует выбор, который не говорит "эффектов", выберите это, поскольку это является, вероятно, самым безопасным.

    Этот вопрос имеет еще некоторую информацию о различных графических интерфейсах, между которыми можно выбрать в Ubuntu.

  4. В более новых версиях Ubuntu можно выбрать между X.org и Уэйлендом на экране входа в систему. Какой бы ни Вы использовали, попробуйте другой. Иногда проблема с Уэйлендом может быть решена при помощи X.org, или наоборот.

  5. Сообщите об ошибке.

Надо надеяться, информация выше передала немного общей информации о том, что могло вызывать этот вид проблемы. Это должно также служить для освещения, какая информация могла бы быть полезна для Вас добавить к Вашему вопросу (в зависимости от определенных деталей проблемы), позволить получить еще лучший ответ. (Или улучшить этот ответ с дополнительной информацией, характерной для Вашей ситуации.)

30
23.06.2013, 17:34
7 ответов

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

Процесс/поток

  • Зависящий от ЦП (нуждается в большом количестве ресурсов ЦП),
  • Память связала (нуждается в большом количестве ресурсов RAM),
  • Ввод-вывод связывается (Ресурсы сетевого и/или жесткого диска)

Все эти три ресурса конечны, и любой может ограничить производительность системы. Необходимо посмотреть, который (мог бы быть 2 или 3 вместе) использует конкретная ситуация.

Можно использовать ntop и iostat, и vmstat диагностировать, что продолжается.

33
27.01.2020, 19:38
  • 1
    Аппаратные средства имеют значение также. Физический, виртуальный, количество ядер, тип ядра, L1/L2/L3 кэш, и т.д. –  EightBitTony 23.06.2013, 17:49

"Почему это происходит?" довольно легко ответить. Предположите, что у Вас есть коридор, что можно соответствовать четырем людям вниз, рядом. Вы хотите переместить весь мусор в один конец к другому концу. Самое эффективное число людей равняется 4.

Если у Вас есть 1-3 человека затем, Вы пропускаете использование некоторого пространства коридора. Если у Вас есть 5 или больше человек, то по крайней мере один из тех людей является в основном застрявшей организацией очередей позади другого человека все время. Добавление все большего количества людей просто забивает коридор, оно не ускоряет acivity.

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

46
27.01.2020, 19:38
  • 1
    Ваш пример вводит в заблуждение. Было бы лучше сказать что-то как: "У Вас есть коридор, что можно соответствовать четырем людям вниз, рядом и он используется Вами и другими людьми для различных задач. Существует рефери, который решает, кто может пройти коридор. Затем самое эффективное число людей больше, чем 4 и меньше, чем некоторое число, где Ваши люди начинают ставить в очередь [очень контекстно-зависимый]". Обычно наличие некоторых потоков больше, чем количество центральных процессоров работает лучше, чем использование точно 4 потоков. Если Вы - единственный с помощью ЦП, то 4 лучшее число. –  Bakuriu 23.06.2013, 21:34
  • 2
    , +1. Bakuriu, пример, который иллюстрирует проблему ограниченного совместно используемого ресурса. Это объясняет проблему, не, как найти оптимальное количество потоков. –  Bananguin 23.06.2013, 22:13
  • 3
    Также было бы полезно принять во внимание, что потоки все еще имеют свой собственный тип контекстного переключения, которое продолжается. Увеличение числа потоков не увеличивает способность производительности (как Вы указали), но это также истощает процессорное время путем предоставления ядру большего количества работы, чтобы сделать. В основном существует убывающая доходность при поточной обработке и выполнении слишком большой ретроградной производительности причин. –  Bratchley 23.06.2013, 23:04
  • 4
    Каждая проблема может быть описана на многих уровнях сложности. Я предложил приближение проблемы, которой я верю, полезно для объяснения основ. Конечно, это может быть более усовершенствовано и более подробное, но чем более подробными Вы делаете это, тем менее полезно это как введение в проблему. –  EightBitTony 24.06.2013, 01:24
  • 5
    я просто добавил бы, что, вместо того, чтобы провести много времени, вычисляя оптимальное количество потоков, просто кодируйте его так, чтобы мог быть изменен легко. Любое большое слияние как это потребует многочисленных тестовых прогонов (большинство с небольшими подмножествами Ваших данных) к идеальному. Увеличьте число потоков, пока Вы не видите большое понижение производительности, или влияние на другое системное действие недопустимо. –  DocSalvager 28.06.2013, 11:23

Общая рекомендация является потоками n+1, n быть количеством доступных ядер процессора. Тот путь n потоки может работать ЦП, в то время как 1 поток ожидает диска ввод-вывод. Наличие меньшего количества потоков не полностью использовало бы ресурс ЦП (в какой-то момент всегда будет ввод-вывод для ожидания), имение большего количества потоков вызвало бы потоки, бьющиеся за ресурс ЦП.

Потоки прибывают не свободные, но с издержками как контекстные переключения, и - если данные должны быть переданы между потоками, который обычно имеет место - различные механизмы блокировки. Это только стоит стоимости, когда у Вас на самом деле есть более выделенные ядра процессора для работы кода. На одноядерном ЦП единственный процесс (никакие отдельные потоки) обычно быстрее, чем какая-либо сделанная поточная обработка. Потоки волшебно не заставляют Ваш ЦП пойти немного быстрее, это просто означает дополнительную работу.

20
27.01.2020, 19:38
  • 1
    Это должно быть общим ответом, учитывая объем информации, доступный рассматриваемый. нам не нужны полноценный тезис и философия как другие ответы –  Allahjane 19.01.2018, 20:29

Как другой указали (slm ответ, ответ EightBitTony), это - сложный вопрос и больше так как Вы не описываете то, что Вы распараллеливаете, делают и как они делают это.

Но окончательно добавление большего количества потоков может сделать вещи хуже.

В области параллельных вычислений существует закон Amdahl, который может быть действующим (или не может, не, но Вы не описываете детали Вас проблема, так....), и может дать некоторое общее понимание об этом классе проблем.

Вопрос права Amdahl - то, что в любой программе (в любом алгоритме) всегда существует процент, который не может быть выполнен параллельно (последовательная часть) и существует другой процент, который может быть выполнен параллельно (параллельная часть) [Очевидно, эти две части составляют в целом 100%].

Это делит на части, может быть выражен как процент времени выполнения. Например, может быть 25% времени, проведенного в строго последовательных операциях, и остающиеся 75% времени потрачены в операции, которая может быть выполнена параллельно.

Image from Wikipedia (Изображение из Википедии)

Закон Amdahl предсказывает, что для каждой данной параллельной части (например, 75%) программы можно ускорить выполнение только до сих пор (например, самое большее 4 раза) даже при использовании все большего количества процессоров, чтобы сделать работу.

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

Учитывая, что Вы используете потоки (и не физические процессоры), ситуация может быть еще хуже, чем это. Помните, что потоки могут быть обработаны (в зависимости от реализации и доступных аппаратных средств, например, центральные процессоры/ядра) совместное использование того же физического процессора / ядро (это - форма многозадачности, как указано в другом ответе).

Этот теоретический прогноз (о процессорном времени) не считает других практическими узкими местами как

  1. Ограниченная скорость ввода-вывода (жесткий диск и сетевая "скорость")
  2. Пределы емкости памяти
  3. Другие

это может легко быть ограничивающим фактором в практическом применении.

10
27.01.2020, 19:38

Преступником здесь должно быть "КОНТЕКСТНОЕ ПЕРЕКЛЮЧЕНИЕ". Это - процесс сохранения состояния текущего потока, чтобы начать выполнять другой поток. Если многим потокам уделяют то же первостепенное значение, они должны быть передвинуты, пока они не заканчивают выполнение.

В Вашем случае, когда существует 50 потоков, большое контекстное переключение происходит по сравнению только с выполнением 10 потоков.

На этот раз наверху представленный из-за контекстного переключения что, заставляя Ваш прогон программы замедлиться

6
27.01.2020, 19:38
  • 1
    Так как мы не знаем, каковы потоки, это, кажется, предположение. Да, контекстное переключение добавляет издержки, но если потоки делают некоторый анализ данных, проблемой могли бы быть проблемы кэша (т.е. не бывший способный использовать кэш, потому что каждый раз Вы переключаете потоки, необходимо сбросить его). –  EightBitTony 24.06.2013, 09:46
  • 2
    Распараллельте контекстное переключение в и себя, если мы не имеем дело с огромным количеством контекстных переключений, вероятно, не окажет влияние порядка величины на производительность. 50 потоков высоки, но не экстремальное значение (на моем поле прямо сейчас, ps ax | wc -l отчеты 225 процессов, и это в большой степени ни в коем случае не загружается). Я склонен пойти с предположением @EightBitTony; аннулирование кэша вероятно большая проблема, потому что каждый раз Вы сбрасываете кэш, ЦП должен ожидать эры кода и данных из RAM. –  a CVn 24.06.2013, 10:21

Зафиксировать метафору EightBitTony:

"Почему это происходит?" довольно легко ответить. Предположите, что у Вас есть два бассейна, один полный и один пустой. Вы хотите переместить всю воду от одного до другого и иметь 4 блока. Самое эффективное число людей равняется 4.

Если у Вас есть 1-3 человека затем, Вы пропускаете использование некоторых блоков. Если у Вас есть 5 или больше человек, то по крайней мере один из тех людей застревает, ожидая блока. Добавление все большего количества людей... не ускоряет действие.

Таким образом, Вы хотите иметь столько людей, сколько может сделать некоторую работу (используйте блок), одновременно.

Человек здесь является потоком, и блок представляет, какой бы ни ресурс выполнения является узким местом. Добавление большего количества потоков не помогает, если они ничего не могут сделать. Кроме того, мы должны подчеркнуть, что передача блока от одного человека другому обычно медленнее, чем единственный человек, просто несущий блок то же расстояние. Таким образом, два потока, сменяющиеся на ядре обычно, выполняют меньше работы, чем единственный поток, работающий вдвое более долго: это из-за дополнительной работы, сделанной для переключения между двумя потоками.

Является ли ограничивающим ресурсом выполнения (блок) ЦП или ядро, или гиперпоточный конвейер инструкции в Ваших целях зависит, на котором часть архитектуры является Вашим ограничивающим фактором. Обратите внимание на то, что также мы предполагаем, что потоки совершенно независимы. Это только имеет место, если они не совместно используют данных (и избегают каких-либо коллизий кэша).

Как несколько человек предположили для ввода-вывода, ограничивающий ресурс мог бы быть количеством полезно queueable операций ввода-вывода: это могло зависеть от большого количества аппаратных средств и факторов ядра, но могло легко быть намного больше, чем количество ядер. Здесь, контекстное переключение, которое является настолько дорогостоящее сравненный для выполнения ограниченного кода, является довольно дешевым по сравнению с вводом-выводом связанный код. Печально я думаю, что метафора полностью выйдет из-под контроля, если я попытаюсь выровнять по ширине это с блоками.

Обратите внимание, что оптимальное поведение с вводом-выводом связанный код состоит в том, чтобы обычно все еще иметь самое большее один поток на конвейер/ядро/ЦП. Однако необходимо написать асинхронный или synchronous/non-blocking код ввода-вывода, и относительно маленькое повышение производительности будет не всегда выравнивать по ширине дополнительную сложность.


PS. Моя проблема с исходной метафорой коридора - это, убедительно предполагает, чтобы Вы смогли иметь 4 очереди людей с 2 очередями, несущими мусор и 2 возврата для сбора больше. Затем можно сделать каждую очередь почти пока коридор, и добавляющие люди действительно ускоряли алгоритм (Вы в основном превратили целый коридор в ленточный конвейер).

На самом деле этот сценарий очень похож на стандартное описание отношений между задержкой и размером окна в сетях TCP, которые являются, почему это выскочило во мне.

3
27.01.2020, 19:38
  • 1
    Это не метафора, это - приближение, разработанное, чтобы объяснить систему людям способом, они могут визуализировать его легко. По сути, это всегда будет 'развеянным' людьми, которые знают следующий уровень детализации, но не понимают, что их уровень детализации не на самом деле необходим для новичков. Никто не изучает физику элементарных частиц путем запуска на уровне доктора философии. Весь материал прежде является приближением, они приводят Вас в него постепенно, совершенствовав его, когда Вы идете. Не 'неправильно', что это - просто не полное изображение. –  EightBitTony 26.06.2013, 00:58
  • 2
    Никто не смущен, по которой фигуре речи Вы использовали, и это не плохая аналогия. Каждая аналогия имеет некоторый предел, вне которого она отличается от вещи, которую она, как предполагается, описывает и прекращает быть полезной. Я только упомянул это, потому что оригинал напомнил мне так сильно другого сценария, и потому что я больше не думаю эта версия комплекс для (надо надеяться), улучшенный прогнозирующий. инструкции –  Useless 26.06.2013, 01:47

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

0
27.01.2020, 19:38

Теги

Похожие вопросы