本文目录导读:

- 核心概念:TCP Autocorking 是什么?
- iSCSI 与 TCP Autocorking 的交互
- 核心参数:
tcp_autocorking(全局开关) - 如何针对 iSCSI 优化 Autocorking 相关参数?
- 总结:针对 iSCSI 的推荐配置
- 检查当前 iSCSI 连接状态的命令
你提到的 tcp_autocork_iscsi 并不是 Linux 内核中一个独立的、直接可配置的内核参数(如 net.ipv4.tcp_autocorking)。
我推测你可能是想问:“TCP Autocorking 机制对 iSCSI(Internet Small Computer Systems Interface,互联网小型计算机系统接口)性能有什么影响?” 或者 “如何针对 iSCSI 调整 TCP Autocorking 相关参数?”
下面我从这两个角度来详细解释。
核心概念:TCP Autocorking 是什么?
- Corking(塞子):是一种延迟发送的策略,当应用程序(iSCSI 发起端)连续多次调用
send()发送小数据包时,内核会把这些小数据包“塞”在缓冲区里,等攒成一个大包(达到 MSS 或超时)再一次性发送,这能提高网络利用率,但可能增加延迟。 - Autocorking:是 Linux 内核 3.5 版本引入的自动 corking 机制,它不再需要应用程序显式设置
TCP_CORK套接字选项,内核会自动判断:如果当前 socket 的发送缓冲区中还有未发送的数据(等待重传或确认),那么后续的send()调用会自动触发 corking,直到之前的窗口被打开。
iSCSI 与 TCP Autocorking 的交互
iSCSI 通常是一种 延迟敏感 和 吞吐量敏感 的应用,它有两种典型的使用场景:
- 普通文件系统访问:混合了大量小的元数据操作(如文件锁、属性查询)和大的数据块读写。
- 大块顺序读写:如数据库的连续写(Oracle ASM、VMware VMFS)。
对大块顺序读写的正面影响
- 场景:iSCSI Initiator 需要发送一个 256KB 的 SCSI Write 命令,TCP 层可能被拆分成多个 TCP 段发送。
- Autocorking 的作用:Initiator 连续调用
send()发送数据,Autocorking 会主动将小包合并在缓冲区,直到达到网卡的 TSO(TCP Segmentation Offload,TCP分段卸载) 卸载大小(通常为 64KB)或填满拥塞窗口,这显著降低了 CPU 利用率(因为中断和协议栈处理次数减少),并提升了吞吐量(因为更好地利用了网络带宽)。
对小数据块/元数据操作的负面影响
- 场景:iSCSI 的 Command、状态确认、小的 SCSI 操作(如 Read Capacity、Inquiry)。
- Autocorking 的潜在问题:如果这些小包因为 Autocorking 而被延迟发送(等待攒包),则会导致 I/O 延迟增加,对于需要低延迟的数据库同步日志写入(如 Oracle redo log 同步写),这种延迟可能是灾难性的。
核心参数:tcp_autocorking(全局开关)
Linux 内核中存在一个全局参数控制是否启用 Autocorking:
- 参数路径:
/proc/sys/net/ipv4/tcp_autocorking - 默认值:
1(开启) - 针对 iSCSI 的调整建议:
- 高吞吐场景:保持 1,关掉会损失吞吐量,增加 CPU 开销。
- 低延迟/同步写场景:可以考虑设为 0,但通常这不是首选,更好的做法是让 iSCSI 应用层自己控制(见下方)。
如何针对 iSCSI 优化 Autocorking 相关参数?
直接关闭全局 Autocorking 是粗鲁的做法,更精细的控制方法有:
调整其他 TCP 参数来配合 Autocorking
tcp_small_packets(某些内核版本):自动对特定数据包类型禁用 Autocorking。- 调整 MTU:更大的 MTU(如 9000 jumbo frames)可以减少小包数量,让 Autocorking 更有效。
- 调整
tcp_low_latency:将该参数设为1或调整其策略,可以强制 TCP 在延迟和吞吐之间做出权衡。
使用 setsockopt() 在应用层控制
这是最推荐的iSCSI优化方式,iSCSI Initiator 软件(如 Open-iSCSI)可以在其代码中显式设置 socket 选项:
- 禁用 Nagle 算法:
TCP_NODELAY,这是关键操作,Nagle 和 Autocorking 机制类似,但更激进,对于 iSCSI,绝大多数实现都会启用TCP_NODELAY。 - 手动控制 Corking:在发送大量数据前调用
TCP_CORK开启,发送完后再关闭,但这需要应用层代码配合(如Open-iSCSI的响应处理)。
调整 iSCSI 自身参数(推荐优先尝试)
最实用的方法是调整 iSCSI 会话的参数,这比调整内核 TCP 参数更可控:
MaxRecvDataSegmentLength (MRDSL):默认 256KB,增大此值(如 1MB)会让 iSCSI 层生成更大的数据包,自然减少小包数量,Autocorking 的负面效应降低。FirstBurstLength:对于写操作,增加初始数据突发的长度。DataPDUInOrder:确保数据有序发送,有助于 TCP 合并。
针对 iSCSI 的推荐配置
- 检查并保持
tcp_autocorking为 1:这是现代内核的默认值,对大部分 iSCSI 工作负载有好处。 - 检查 iSCSI Initiator 的
NODELAY设置:使用ss -t -i命令查看 iSCSI 连接是否显示了nodelay(nodelay:1)。如果显示nodelay:0,请检查你的 iSCSI Initiator 配置,确保它启用了 Nagle 算法的禁用。 - 优先调整 iSCSI 参数:增大
MaxRecvDataSegmentLength和FirstBurstLength。 - 最后手段:如果延迟仍然不可接受(特别是混合小数据包的应用场景),可以考虑关闭全局 Autocorking:
echo 0 > /proc/sys/net/ipv4/tcp_autocorking
但请做性能基准测试对比,因为关闭可能降低大块数据传输的吞吐量。
检查当前 iSCSI 连接状态的命令
# 查看 iSCSI 连接使用的 TCP 参数 ss -t -i | grep -A 2 "iscsi" # 或者查看特定端口 (iSCSI 默认 3260) ss -t -i sport = :3260
输出中你会看到 autocorking 和 nodelay 标志:
autocorking:1表示该连接正在使用 Autocorking。nodelay:1表示禁用了 Nagle 算法。
没有名为 tcp_autocork_iscsi 的独立内核参数,iSCSI 利用的是通用的 TCP Autocorking 机制,优化思路是:保持全局 Autocorking 开启,通过开启 TCP_NODELAY 和调整 iSCSI 自身的段大小 来达到最佳平衡。
标签: 内核优化