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锁不可获取,不是立即失败,而是放入缓冲区。
  • 防止请求丢失:部分场景下避免因为临时资源短缺而丢失的请求。