[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.