Как лучше всего обнаружить занятые ядра ЦП для управления запросами blk-mq в ядре Linux?Linux

Ответить
Anonymous
 Как лучше всего обнаружить занятые ядра ЦП для управления запросами blk-mq в ядре Linux?

Сообщение Anonymous »

Я пытаюсь реализовать управление запросами на уровне blk-mq ядра Linux, чтобы распределять запросы ввода-вывода между ядрами ЦП в зависимости от нагрузки. Моя цель — перенаправить запросы от занятых ядер к менее занятым, чтобы добиться низкой задержки и высокой пропускной способности.
Я использую атомарный счетчик nr_active для каждого аппаратного контекста, чтобы измерить, сколько активных запросов у ядра в данный момент имеется. Когда количество активных запросов превышает определенный порог, я пытаюсь переключить запрос на другое ядро ​​с меньшим количеством активных запросов.
Однако я наблюдаю, что загрузка ЦП, показанная такими инструментами, как htop, указывает на то, что только одно ядро ​​обрабатывает большую часть нагрузки. Кроме того, мой более простой резервный код, который просто меняет назначение ЦП без проверки нагрузки, работает лучше, чем мой код управления с учетом нагрузки.
Вот упрощенная версия моего кода управления с учетом нагрузки:

Код: Выделить всё

static void blk_switch_select_ctx(struct blk_mq_alloc_data *data)
{
struct request_queue *q = data->q;
struct blk_mq_hw_ctx *iter_hctx;
unsigned int cur_cpu = data->ctx->cpu;
unsigned int target_cpu = cur_cpu;
int ptr_cpu;
int T_active = 0;
int min_active = UINT_MAX;
int thresh = 16;

iter_hctx = data->ctx->hctxs[HCTX_TYPE_DEFAULT];
T_active = atomic_read(&iter_hctx->nr_active);

if (T_active queue_ctx, ptr_cpu)->hctxs[HCTX_TYPE_DEFAULT];
T_active = atomic_read(&iter_hctx->nr_active);

if (T_active ctx = per_cpu_ptr(q->queue_ctx, target_cpu);
}
}
А этот более простой код просто переключается на следующий процессор без проверки нагрузки:

Код: Выделить всё

static void blk_switch_select_ctx(struct blk_mq_alloc_data *data)
{
struct request_queue *q = data->q;
unsigned int cpu = data->ctx->cpu;
unsigned int next_cpu = (cpu + 1) % nr_cpu_ids;
data->ctx = per_cpu_ptr(q->queue_ctx, next_cpu);
}
Почему этот более простой код работает лучше? Я неправильно понимаю, как определить «занятое» ядро ​​с помощью nr_active? Как я могу правильно определить, занято ядро ​​или нет в контексте blk-mq?
Моя среда:

Код: Выделить всё

Linux Kernel: 5.10
Ubuntu-20.04
NUMA node: 1
CPUs: 12
Конфигурация тестера fio:

Код: Выделить всё

#!/bin/bash

sudo bash -c "echo 3 > /proc/sys/vm/drop_caches"

fio \
--name=random_read \
--filename=/dev/nvme0n1 \
--rw=randread \
--direct=1 \
--ioengine=libaio \
--size=1G \
--gtod_reduce=0 \
--cpus_allowed_policy=split \
--thread \
--group_reporting \
--time_based \
--runtime=30 \
--ramp_time=10 \
--bs=4k \
--iodepth=128 \
--cpus_allowed=0 \
--numjobs=6
Наконец, есть ли какой-нибудь способ добиться низкой задержки и высокой пропускной способности, кроме простого кода?
Извините, если это простой вопрос, я все еще изучаю внутренние механизмы уровня блоков ядра. Будем очень признательны за любые советы и рекомендации!
Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/797 ... ing-in-lin
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»