Linux iocost_model校准权重与线性回归参数iocost是Linux块层的I/O成本模型控制器它使用线性回归算法在线校准块设备的I/O延迟与I/O深度之间的关系模型。该模型的核心是求解两个参数one_fitto_one_fit(单位I/O的线性成本)和const_peri_const(恒定成本/背景延迟)从而为每个cgroup动态计算合适的I/O权重。成本模型的结构定义iocost的成本模型基于线性回归拟合通过采集I/O延迟和I/O深度的样本点拟合出y ax b形式的直线其中a是单位I/O增加的延迟b是基准延迟。cstruct ioc_cost_model {struct ioc_params {unsigned int one_fit; /* 线性成本系数 */unsigned int const_peri; /* 恒定成本 */unsigned int cost_mult; /* 成本倍数用于缩放 */} params[IOC_NR_MODES]; /* 支持read和write两种模式 *//** 统计采集区间用于过滤采样数据*/unsigned int nr_samples;unsigned int sample_interval;/** 线性回归中间变量*/struct ioc_regression_data {u64 sum_x; /* Σx: I/O深度之和 */u64 sum_y; /* Σy: 延迟之和 */u64 sum_xy; /* Σxy: 乘积之和 */u64 sum_xx; /* Σx²: 深度平方和 */u64 sum_yy; /* Σy²: 延迟平方和 */u64 nr; /* 样本数 */} regression[IOC_NR_MODES];};线性回归的样本采集每当一个I/O请求完成时iocost记录该I/O的深度(I/O队列中同时正在处理的请求数)和延迟(完成时间减去下发时间)。这些样本被累加到回归数据结构体中。cvoid ioc_cost_model_add_sample(struct ioc *ioc, int mode,u64 depth, u64 latency){struct ioc_regression_data *rd ioc-model.regression[mode];struct ioc_params *params ioc-model.params[mode];/** 样本过滤忽略异常值只保留合理范围内的样本*/if (latency params-const_peri * 100)return; /* 延迟异常大可能是系统抖动 */if (depth 0)depth 1;/** 累积回归统计量*/rd-sum_x depth;rd-sum_y latency;rd-sum_xy depth * latency;rd-sum_xx depth * depth;rd-sum_yy latency * latency;rd-nr;/** 当样本数达到阈值时触发模型校准*/if (rd-nr ioc-model.nr_samples)ioc_cost_model_calibrate(ioc, mode);}模型校准的核心算法ioc_cost_model_calibrate使用最小二乘法拟合线性方程。one_fit (n*Σxy - Σx*Σy) / (n*Σxx - (Σx)²)const_peri (Σy - one_fit*Σx) / n。cstatic void ioc_cost_model_calibrate(struct ioc *ioc, int mode){struct ioc_regression_data *rd ioc-model.regression[mode];struct ioc_params *params ioc-model.params[mode];u64 n rd-nr;if (n 2) {/* 样本太少不足以拟合 */return;}/** 计算分母: n*Σxx - (Σx)²* 如果分母为0或接近0说明数据点垂直分布无法拟合*/u64 denom n * rd-sum_xx - rd-sum_x * rd-sum_x;if (denom (u64)n * n / 4) {/* 数据分散度不足使用当前值 */goto reset;}/** 分子: n*Σxy - Σx*Σy*/u64 numer n * rd-sum_xy - rd-sum_x * rd-sum_y;s64 one_fit (s64)div64_u64(numer, denom);/** 合理性检查one_fit表示每增加一个并发I/O* 延迟的增加量必须为正且合理*/if (one_fit 0 || one_fit params-const_peri * 10) {goto reset;}/** 计算const_peri: (Σy - one_fit*Σx) / n* 即y ax b中的b y_bar - a*x_bar*/u64 sum_y_adj rd-sum_y - one_fit * rd-sum_x;s64 const_peri (s64)div64_u64(sum_y_adj, n);if (const_peri 0) {const_peri 1; /* 保底值 */}/** 使用指数加权移动平均平滑参数更新* 防止单次校准引入过大波动*/params-one_fit (params-one_fit * 3 (u64)one_fit * 2) / 5;params-const_peri (params-const_peri * 3 (u64)const_peri * 2) / 5;trace_iocost_model_calibrate(ioc, mode, one_fit, const_peri);reset:/** 重置回归数据开始下一轮采集*/memset(rd, 0, sizeof(*rd));}校准完成后iocost使用模型参数计算每个I/O操作的预计成本。cu64 ioc_cost_model_calc_cost(struct ioc *ioc, int mode,u64 depth){struct ioc_params *params ioc-model.params[mode];/** 预计延迟 one_fit * depth const_peri* 乘以cost_mult进行缩放后返回*/u64 cost (params-one_fit * depth params-const_peri)* params-cost_mult / 100;return cost;}I/O成本模型的校准质量直接影响iocost的带宽分配精度。通过持续不断的线性回归iocost能够自适应不同类型的块设备性能特征——NVMe SSD的低延迟特性会校准出较小的one_fit而HDD的高寻道延迟则会产生较大的one_fit从而确保cgroup间的I/O权重分配可以反映底层设备的真实成本。
Linux iocost_model校准权重与线性回归参数
发布时间:2026/6/13 7:25:59
Linux iocost_model校准权重与线性回归参数iocost是Linux块层的I/O成本模型控制器它使用线性回归算法在线校准块设备的I/O延迟与I/O深度之间的关系模型。该模型的核心是求解两个参数one_fitto_one_fit(单位I/O的线性成本)和const_peri_const(恒定成本/背景延迟)从而为每个cgroup动态计算合适的I/O权重。成本模型的结构定义iocost的成本模型基于线性回归拟合通过采集I/O延迟和I/O深度的样本点拟合出y ax b形式的直线其中a是单位I/O增加的延迟b是基准延迟。cstruct ioc_cost_model {struct ioc_params {unsigned int one_fit; /* 线性成本系数 */unsigned int const_peri; /* 恒定成本 */unsigned int cost_mult; /* 成本倍数用于缩放 */} params[IOC_NR_MODES]; /* 支持read和write两种模式 *//** 统计采集区间用于过滤采样数据*/unsigned int nr_samples;unsigned int sample_interval;/** 线性回归中间变量*/struct ioc_regression_data {u64 sum_x; /* Σx: I/O深度之和 */u64 sum_y; /* Σy: 延迟之和 */u64 sum_xy; /* Σxy: 乘积之和 */u64 sum_xx; /* Σx²: 深度平方和 */u64 sum_yy; /* Σy²: 延迟平方和 */u64 nr; /* 样本数 */} regression[IOC_NR_MODES];};线性回归的样本采集每当一个I/O请求完成时iocost记录该I/O的深度(I/O队列中同时正在处理的请求数)和延迟(完成时间减去下发时间)。这些样本被累加到回归数据结构体中。cvoid ioc_cost_model_add_sample(struct ioc *ioc, int mode,u64 depth, u64 latency){struct ioc_regression_data *rd ioc-model.regression[mode];struct ioc_params *params ioc-model.params[mode];/** 样本过滤忽略异常值只保留合理范围内的样本*/if (latency params-const_peri * 100)return; /* 延迟异常大可能是系统抖动 */if (depth 0)depth 1;/** 累积回归统计量*/rd-sum_x depth;rd-sum_y latency;rd-sum_xy depth * latency;rd-sum_xx depth * depth;rd-sum_yy latency * latency;rd-nr;/** 当样本数达到阈值时触发模型校准*/if (rd-nr ioc-model.nr_samples)ioc_cost_model_calibrate(ioc, mode);}模型校准的核心算法ioc_cost_model_calibrate使用最小二乘法拟合线性方程。one_fit (n*Σxy - Σx*Σy) / (n*Σxx - (Σx)²)const_peri (Σy - one_fit*Σx) / n。cstatic void ioc_cost_model_calibrate(struct ioc *ioc, int mode){struct ioc_regression_data *rd ioc-model.regression[mode];struct ioc_params *params ioc-model.params[mode];u64 n rd-nr;if (n 2) {/* 样本太少不足以拟合 */return;}/** 计算分母: n*Σxx - (Σx)²* 如果分母为0或接近0说明数据点垂直分布无法拟合*/u64 denom n * rd-sum_xx - rd-sum_x * rd-sum_x;if (denom (u64)n * n / 4) {/* 数据分散度不足使用当前值 */goto reset;}/** 分子: n*Σxy - Σx*Σy*/u64 numer n * rd-sum_xy - rd-sum_x * rd-sum_y;s64 one_fit (s64)div64_u64(numer, denom);/** 合理性检查one_fit表示每增加一个并发I/O* 延迟的增加量必须为正且合理*/if (one_fit 0 || one_fit params-const_peri * 10) {goto reset;}/** 计算const_peri: (Σy - one_fit*Σx) / n* 即y ax b中的b y_bar - a*x_bar*/u64 sum_y_adj rd-sum_y - one_fit * rd-sum_x;s64 const_peri (s64)div64_u64(sum_y_adj, n);if (const_peri 0) {const_peri 1; /* 保底值 */}/** 使用指数加权移动平均平滑参数更新* 防止单次校准引入过大波动*/params-one_fit (params-one_fit * 3 (u64)one_fit * 2) / 5;params-const_peri (params-const_peri * 3 (u64)const_peri * 2) / 5;trace_iocost_model_calibrate(ioc, mode, one_fit, const_peri);reset:/** 重置回归数据开始下一轮采集*/memset(rd, 0, sizeof(*rd));}校准完成后iocost使用模型参数计算每个I/O操作的预计成本。cu64 ioc_cost_model_calc_cost(struct ioc *ioc, int mode,u64 depth){struct ioc_params *params ioc-model.params[mode];/** 预计延迟 one_fit * depth const_peri* 乘以cost_mult进行缩放后返回*/u64 cost (params-one_fit * depth params-const_peri)* params-cost_mult / 100;return cost;}I/O成本模型的校准质量直接影响iocost的带宽分配精度。通过持续不断的线性回归iocost能够自适应不同类型的块设备性能特征——NVMe SSD的低延迟特性会校准出较小的one_fit而HDD的高寻道延迟则会产生较大的one_fit从而确保cgroup间的I/O权重分配可以反映底层设备的真实成本。