7

Сложный вопрос: я думаю, что мои средние нагрузки слишком высоки по сравнению с системой Linux. У меня около 0,40 1 минуты без использования процессора (0-1%), и даже если это распределено по четырем ядрам, оно все равно равно примерно 0,10 = 10% использования процессора, что не правильно. Теперь я узнал, что средняя нагрузка учитывает не только использование процессора, но и нагрузку на диск и сеть. Поэтому я попытался найти значение ожидания ввода-вывода, но это, кажется, не доступно на Mac по какой-то причине? У меня есть US, SY и ID, конечно, в инструменте iostat, но никаких признаков io wait% (называемого WI, если я не помню).

Все просто отлично, и у меня есть такие же средние значения нагрузки на других моих маках, что я здесь понимаю, ПОЧЕМУ средние значения рассчитываются таким образом (этот высокий) и как я могу проанализировать его дальше?

Я потратил 2 часа на эту тему, но об этом мало или никто не говорит, есть идеи?

1 ответ1

12

Нагрузка - это среднее количество запущенных процессов. man 3 getloadavg говорит:

Функция getloadavg() возвращает число процессов в очереди выполнения системы, усредненное за различные периоды времени. До нескольких выборок извлекается и присваивается последовательным элементам loadavg [].
Система накладывает максимум 3 выборки, представляющих средние значения за последние 1, 5 и 15 минут, соответственно.

Вы также можете получить ту же информацию, запустив sysctl vm.loadavg .


Предполагая Mac OS X 10.7.2, функция getloadavg вызывает этот код здесь (поиск второго вхождения sysctl_loadavg), который, по сути, возвращает текущее значение averunnable .

Это, в свою очередь, определяется здесь:

struct loadavg averunnable =
    { {0, 0, 0}, FSCALE };      /* load average, of runnable procs */

Этот файл также определяет compute_averunnable , который вычисляет новое взвешенное значение averunnable .


Заголовочный файл планировщика sched.h объявляет его как extern , и все реализации планировщика в xnu-1699.24.8/osfmk/kern/sched_*.c периодически вызывают его через compute_averages в sched_average.c.

Аргумент для compute_averunnable , sched_nrun в sched_average.c , получает его значение из sched_run_count в sched.h.

Этот номер изменяется макросами sched_run_incr и sched_run_decr , используемыми исключительно в файле sched_prim.c , которые являются примитивами планирования, отвечающими за разблокировку, диспетчеризацию и т.д. Потоков .


Итак, резюмируем:

Он просто использует количество выполняемых потоков для вычисления средних значений нагрузки с интервалом в 5 секунд.


Хотя системы совершенно разные, мне трудно поверить, что Linux всегда имеет более низкие нагрузки, чем OS X. На самом деле, похоже, что Linux просто показывает другое значение.

Цитируя Википедию:

В современных системах UNIX обработка потоков по отношению к средним значениям нагрузки варьируется. Некоторые системы рассматривают потоки как процессы для вычисления среднего значения нагрузки: каждый ожидающий выполнения поток добавляет 1 к нагрузке. Однако другие системы, особенно системы, реализующие так называемую потоковую обработку N: M, используют разные стратегии, такие как подсчет процесса ровно один раз с целью загрузки (независимо от количества потоков) или подсчет только потоков, отображаемых в данный момент пользователем. -поток в ядро, который может зависеть от уровня параллелизма, установленного в процессе.

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

Поскольку каждый запускаемый процесс имеет хотя бы один выполняемый поток, средние значения нагрузки в OS X будут, при условии вычисления эквивалентной средней нагрузки (который я не удосужился проверить), всегда быть по крайней мере такими же большими, поскольку элемент считает, что они ' на основе разные.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .