iSCSI session 反复 logout/login 是内核驱动主动重建会话所致,主因包括网络抖动、NOOP_IN 超时、recovery_tmo 过短或 MPIO failover 失效;关键超时参数通过 /sys/class/iscsi_session/session*/ 下 recovery_tmo(建议 300~600)、abort_tmo(≥30)等动态调整,须在 session 为 Logging in 或 Free 状态时写入。

为什么 iSCSI session 会反复 logout/login?
这不是连接断开重连那么简单,而是内核 iscsi_tcp 或 bnx2i 等驱动在检测到路径异常后触发的主动 session 重建。常见诱因包括:网络抖动导致 ping 超时、target 未响应 NOOP_IN、session recovery timeout 设置过短,或 MPIO 多路径未正确 failover。根本原因往往藏在 /var/log/messages 里反复出现的 iscsi: detected conn error 或 session recovery timed out。
关键 timeout 参数在哪改?
所有超时值都通过 sysfs 接口动态控制,路径统一为 /sys/class/iscsi_session/session*/ 下的文件:
-
recovery_tmo:session 级恢复超时(秒),默认 120,建议设为 300~600 -
abort_tmo:abort task 命令超时(秒),默认 15,建议 ≥30 -
lu_reset_tmo和tgt_reset_tmo:LUN/target 复位超时,建议统一设为 30 -
fast_abort:设为1可跳过部分 abort 流程,减少 recovery 延迟
注意:这些值必须在 session 处于 Logging in 或 Free 状态时写入,否则会报 Invalid argument。可配合 iscsiadm -m session -P 3 查看当前 session 状态。
MPIO 配置如何避免误触发 logout?
MPIO 本身不自动修复 session,它只负责路径选择与 failover。若配置不当,反而加剧 logout 频率:
-
path_selector必须设为"round-robin 0"或"queue-length 0",不能用service-time(已弃用且易卡住) - 每条路径的
state应为active,用multipath -ll确认;若显示failed,检查对应 session 的recovery_tmo是否已超 -
rr_min_io_rq建议设为1(而非默认 1000),尤其在小 IO 场景下能更快感知路径失效 - target 端必须启用
Immediate Data和InitialR2T,否则某些 initiator 会在 NOOP_IN 超时后直接 logout
另外,不要依赖 iscsiadm --mode node --op update 修改 node.session.timeo.replacement_tmo:这个值只影响 discovery 阶段,对已建立 session 无效。
验证与持续观察要点
改完参数后不能只看 iscsiadm -m session 显示“up”,要抓真实行为:
- 用
tcpdump -i any port 3260 -w iscsi.pcap抓包,确认 NOOP_IN/OUT 间隔是否稳定(默认 5 秒) - 检查
/proc/scsi/scsi中 LUN 的State是否长期为running,而非反复经历blocked → running - 若使用 Dell EMC Unity 或 NetApp ONTAP,务必确认 target 端
MaxConnections和SessionIdleTime未设得比 initiator 的recovery_tmo更激进
最常被忽略的是:同一 host 上多个 session 共享一个 network interface 时,单个 session 的 recovery_tmo 调高了,但底层网卡丢包率上升,最终仍会 cascade 触发全局 session 重建。这时候得查 ethtool -S 输出里的 rx_missed_errors。






























