[20260315]tcp_keepalive_time的设置问题.txt

[20260315]tcp_keepalive_time的设置问题.txt

--//前面的测试设置SQLNET.EXPIRE_TIME=1在sqlnet.ora文件,发现开始keepalive=60,然后开始递减。接着分成2部分。并不是从60开
--//始,分别6秒,54秒2部分。

--//跟踪启动进程,发现如下信息:
$ strace -f -o xxx.txt sqlplus scott/book@book01p
quit

$ grep -i TCP_KEEP xxx.txt
14243 setsockopt(9, SOL_TCP, TCP_KEEPIDLE, [60], 4) = 0
14243 setsockopt(9, SOL_TCP, TCP_KEEPINTVL, [6], 4) = 0
14243 setsockopt(9, SOL_TCP, TCP_KEEPCNT, [10], 4) = 0

--//设置TCP_KEEPIDLE=60,TCP_KEEPINTVL=6,TCP_KEEPCNT=10,我以前的理解是在前面探测60秒网络不通的情况下,探测6秒,如此探测
--//10次,不通网络断开。也就是后面2个参数仅仅在网络存在问题时有效。
--//实际的情况是网络通的情况下分成2部分,分别是6秒,54秒,有点钻牛角尖了。

--//于是修改以上参数。注解sqlnet.ora的SQLNET.EXPIRE_TIME=1
# sysctl -p /etc/sysctl.d/99-sysctl.conf
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 3
--//确实测试到分成2部分的情况,分别是10秒,50秒。

--//一般情况下都是TCP_KEEPIDLE>TCP_KEEPINTVL,如果翻过来呢?
--//出于好奇补充这个测试。

1.环境:
SYS@book> @ ver2
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 21.0.0.0.0
BANNER                        : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY                 : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

$ egrep -v "^#|^$" /u01/app/oracle/homes/OraDB21Home1/network/admin/sqlnet.ora
DEFAULT_SDU_SIZE = 1048576
ADR_BASE = /u01/app/oracle

# grep "^net.ipv4.tcp" /etc/sysctl.conf
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 70
net.ipv4.tcp_keepalive_probes = 3
--//tcp_keepalive_intvl>tcp_keepalive_time

2.测试:
# sysctl -p /etc/sysctl.conf
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 70
net.ipv4.tcp_keepalive_probes = 3

--//window 1,注以root用户执行,不然netstat -p参数无效。tee 要加入-a参数。
# seq 4000 | xargs -IQ bash -c "netstat -tnpo | egrep oraclebook | ts.awk| tee -a xxx1.txt ;sleep 1"

--//window 2
$ strace -f -o xxx.txt sqlplus scott/book@book01p
SQL*Plus: Release 21.0.0.0.0 - Production on Sun Mar 15 09:50:57 2026
Version 21.3.0.0.0
Copyright (c) 1982, 2021, Oracle.  All rights reserved.
Last Successful login time: Sun Mar 15 2026 09:50:17 +08:00
Connected to:
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
SCOTT@book01p>
--//5分钟打入quit退出。

--//window 1:
# seq 4000 | xargs -IQ bash -c "netstat -tnpo | egrep oraclebook | ts.awk| tee -a xxx1.txt ;sleep 1"
[2026-03-15 09:50:57] tcp        0    256 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      on (0.19/0/0)
[2026-03-15 09:50:58] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (58.83/0/0)
[2026-03-15 09:50:59] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (57.81/0/0)
[2026-03-15 09:51:00] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (56.79/0/0)
......
[2026-03-15 09:51:54] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (2.95/0/0)
[2026-03-15 09:51:55] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (1.92/0/0)
[2026-03-15 09:51:56] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (0.90/0/0)
[2026-03-15 09:51:57] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (0.05/0/0)
[2026-03-15 09:51:58] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (69.25/0/0)
[2026-03-15 09:51:59] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (68.21/0/0)
[2026-03-15 09:52:00] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (67.19/0/0)
[2026-03-15 09:52:01] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (66.16/0/0)
[2026-03-15 09:52:02] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (65.13/0/0)
....
[2026-03-15 09:53:01] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (7.06/0/0)
[2026-03-15 09:53:02] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (5.92/0/0)
[2026-03-15 09:53:03] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (4.81/0/0)
[2026-03-15 09:53:04] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (3.78/0/0)
[2026-03-15 09:53:05] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (2.75/0/0)
[2026-03-15 09:53:06] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (1.71/0/0)
[2026-03-15 09:53:07] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (0.69/0/0)
[2026-03-15 09:53:08] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (69.80/0/0)
[2026-03-15 09:53:09] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (68.77/0/0)
[2026-03-15 09:53:10] tcp        0      0 127.0.0.1:1521          127.0.0.1:25667         ESTABLISHED 4647/oraclebook      keepalive (67.73/0/0)
--//很明显这样就看不见keepalive分成2部分的情况,除了第1次间隔60秒外,以后每次都是75秒。

$ grep -i TCP_KEEP xxx.txt
--//采用系统设置,会话不会设置相关参数,直接采用系统内核设置参数。

$ grep setsockopt xxx.txt
4645  setsockopt(9, SOL_TCP, TCP_NODELAY, [1], 4) = 0
4645  setsockopt(9, SOL_SOCKET, SO_SNDTIMEO, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0
4645  setsockopt(9, SOL_SOCKET, SO_RCVTIMEO, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0

--//重复测试,补充有sql语句执行的情况。
# seq 4000 | xargs -IQ bash -c "netstat -tnpo | egrep oraclebook | ts.awk| tee -a xxx1.txt ;sleep 1"
[2026-03-15 10:48:56] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (59.30/0/0)
[2026-03-15 10:48:57] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (58.28/0/0)
[2026-03-15 10:49:11] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (44.75/0/0)
[2026-03-15 10:49:12] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (43.72/0/0)
--//window 1:
SCOTT@book01p> select sysdate from dual ;
SYSDATE
-------------------
2026-03-15 10:49:12

[2026-03-15 10:49:13] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (42.69/0/0)
..
[2026-03-15 10:49:53] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (2.26/0/0)
[2026-03-15 10:49:54] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (1.23/0/0)
[2026-03-15 10:49:55] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (0.21/0/0)
[2026-03-15 10:49:57] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (15.76/0/0)
--//补充16秒。
[2026-03-15 10:49:58] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (14.74/0/0)
[2026-03-15 10:49:59] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (13.71/0/0)

[2026-03-15 10:52:31] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (1.24/0/0)
[2026-03-15 10:52:32] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (0.18/0/0)
[2026-03-15 10:52:33] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (69.30/0/0)
[2026-03-15 10:52:35] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (68.28/0/0)
[2026-03-15 10:52:36] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (67.25/0/0)
...
[2026-03-15 10:53:21] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (21.92/0/0)
[2026-03-15 10:53:22] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (20.89/0/0)
[2026-03-15 10:53:23] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (19.72/0/0)
--//window 1:
SCOTT@book01p> select sysdate from dual ;
SYSDATE
-------------------
2026-03-15 10:53:23
--//window 2:
[2026-03-15 10:53:24] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (18.64/0/0)
[2026-03-15 10:53:25] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (17.61/0/0)
[2026-03-15 10:53:26] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (16.58/0/0)
...
[2026-03-15 10:53:42] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (0.72/0/0)
[2026-03-15 10:53:43] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (40.40/0/0)
--//补充41秒。
[2026-03-15 10:53:44] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (39.38/0/0)
[2026-03-15 10:53:45] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (38.36/0/0)
[2026-03-15 10:53:46] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (37.34/0/0)
[2026-03-15 10:53:47] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (36.31/0/0)
[2026-03-15 10:53:48] tcp        0      0 127.0.0.1:1521          127.0.0.1:25671         ESTABLISHED 7637/oraclebook      keepalive (35.27/0/0)

3.继续测试:
--//修改SQLNET.EXPIRE_TIME=2:
$ egrep -v "^#|^$" /u01/app/oracle/homes/OraDB21Home1/network/admin/sqlnet.ora
DEFAULT_SDU_SIZE = 1048576
ADR_BASE = /u01/app/oracle
SQLNET.EXPIRE_TIME=2

$ grep setsockopt xxx2.txt
6964  setsockopt(9, SOL_TCP, TCP_NODELAY, [1], 4) = 0
6964  setsockopt(9, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
6964  setsockopt(9, SOL_TCP, TCP_KEEPIDLE, [120], 4) = 0
6964  setsockopt(9, SOL_TCP, TCP_KEEPINTVL, [6], 4) = 0
6964  setsockopt(9, SOL_TCP, TCP_KEEPCNT, [10], 4) = 0
6964  setsockopt(9, SOL_SOCKET, SO_SNDTIMEO, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0
6964  setsockopt(9, SOL_SOCKET, SO_RCVTIMEO, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0
6964  setsockopt(9, SOL_SOCKET, SO_KEEPALIVE, [0], 4) = 0
--//两者都设置的情况下,优先使用SQLNET.EXPIRE_TIME=2设置。
--//设置TCP_KEEPIDLE=120,TCP_KEEPINTVL=6,TCP_KEEPCNT=10.



请使用浏览器的分享功能分享到微信等