none
Windows 10. Странности в распределении времени процессора между процессами с различными приоритетами. RRS feed

  • Вопрос

  • Имеются две программы. Обе в состоянии загрузить процессор на 100%. Т. е. в начале работы каждая из них задействует все имеющиеся у процессора свободные потоки. По мере приближения к решению, потребности этих задач в ресурсах процессора падают. В завершающей стадии каждая из задач использует один поток, но на 100%. Используется только память и процессор, работы с файлами и сетью нет. Обе задачи работаю долго, по много суток.

    Пример. Работает программа А в завершающей стадии и для неё устанавливается приоритет «Обычный» с помощью диспетчера задач. Диспетчер задач показывает 8% загрузки процессора (всего потоков 12). Запускается программа Б, для неё устанавливается с приоритет «Низкий». Наблюдаю следующую картину.

    Программа А по прежнему использует 8% ЦП.

    Программа Б использует 85-90% ЦП.

    Но! После запуска программы Б скорость вычислений программы А упала в три раза! Скорость определяется по количеству выполненных подзадач. Скорость постоянно выводится в информационное поле.

    Не могу найти ни одного логичного объяснения, и соответственно, не могу понять как исправить ситуацию.

    Кто-нибудь встречался с таким явлением?

    6 января 2020 г. 9:53

Все ответы

  • В программировании есть такое страшное понятие: когерентность кэша (также смотрите инвалидация кэша).

    Вполне возможно, программа Б часто обращается к новым областям памяти, таким образом вызывая обновление кэша. В результате в программе А часто случаются промахи кэша (cache miss). В итоге она ждёт, пока данные подгрузятся из основной памяти в кэш. Отсюда и снижение производительности.

    Так ли это на самом деле, может ответить лишь профилирование. Запускайте профайлер, изучайте.

    Что можно предпринять? Приколотить каждый поток гвоздями к конкретному ядру. Смотрите Processor affinity (а также thread affinity). Когда поток привязан к определённому ядру/процессору, то ОС не будет его перекидывать на другие ядра и шанс того, что в кэше будут необходимые данные, повышается.

    PS: Как известно, некоторые игры страдают тем, что задают аффинити. В результате в многоядерном процессоре активно работает одно ядро и перегревается, после чего происходит либо троттлинг, либо проц вообще вырубается... Так что действуйте осторожно.

    6 января 2020 г. 15:34
  • Спасибо за советы, возможно, в этом направлении удастся что-то найти.

    Как я понимаю, вы начинаете рассуждать о неких «резонансных явлениях» в самом процессоре. При выполнении различных программ, на мой взгляд, это крайне маловероятное событие. Почему тогда не конфликтуют несколько потоков одной задачи? Все они используют одни и те же фрагменты программного кода, и работают с данными в совершенно различных областях ОП. Вот где должен, по идее, возникать резонанс! При этом, измеритель скорости правильно реагирует на завершение выполнения одного из потоков.

    Я склонен думать, что существуют дефекты алгоритма распределения вычислительных ресурсов. Появится возможность, попробую повторить эксперимент на серверной ОС.

    7 января 2020 г. 1:09