linux_pressure
在看linux的代码的时候,看到了很多关于backlog的说法,进而了解到linux下的back pressure机制。故在此记录下。
Applying Back Pressure When Overload,系统持续过载的处理手段,核心观点,限制队列长度。从而为队列中的任务维持系统高吞吐率和良好的响应时间。
在linux内核中。backlog是一个在多个子系统(网络协议栈,加密模块,块设备子系统)中的通用概念。本质上表示 “任务积压队列”或者“待处理任务的缓冲区”。虽然出现在不同的子系统中,但核心思想类似,都是当资源暂时不可用/系统无法立即处理即时任务时,将任务缓存在backlog中等待稍后处理。
是什么?
backlog是一个临时存储结构,处理以下情况
- 当前任务 不可立即完成,如资源竞争,锁冲突等。
- 当前任务 执行上下文(中断、软中断)不适合执行较重操作
- 有限处理能力暂时无法跟上任务到达速度
- 为了更好地资源调度和并发控制。
通常,backlog会配合异步处理机制(软中断,工作队列)一起使用。
crypto中的backlog
crypto api 中的 backlog 更多是异步请求的概念。
- 当当前算法驱动忙碌(无法立即处理请求),请求会被挂到backlog中。
- 当驱动空闲时,通过crypt_dequeue_request将请求取出处理。
- 一般结合软中断,tasklet,workqueue等延迟调度机制来实现。
通用机制
backlog一般具备以下机制。
| 机制组成 | 说明 |
|---|---|
| 队列结构 | 通常为链表,如 list_head,或环形缓冲区等 |
| 入队操作 | 当不能立即处理请求时,调用 enqueue() 将请求加入 |
| 出队处理 | 某个异步事件(如软中断、tasklet、workqueue)触发处理 |
| 并发控制 | 多用自旋锁或 RCU 保证并发安全 |
| 队列限流 | 使用最大队列长度(max_backlog)限制,防止 OOM 或 DoS |
为什么用?
- 性能优化: 在高并发场景下。避免阻塞上下文,提高整体吞吐。
- 上下文切换控制:中断上下文不可以睡眠,将请求延时处理。
- 资源争用时做缓冲:eg socket锁不可获取,不是立即失败,而是放入缓冲区。
- 防止请求丢失:部分场景下避免因为临时资源短缺而丢失的请求。