CentOS 上用 lsnrctl 优化 Oracle 监听器性能
一 基线检查与快速定位
- 查看监听状态与服务注册:执行 lsnrctl status,确认监听端口(默认 1521)、服务映射、当前连接概况。
- 观察日志是否异常增长或写入缓慢:执行 lsnrctl show log_status;日志路径通常为 $ORACLE_HOME/network/log/listener.log,或使用 diag 路径 $ORACLE_HOME/diag/tnslsnr/<主机名>/listener/trace/listener.log。
- 动态调低日志级别以排除性能干扰:执行 lsnrctl set log_level 16(数值越小日志越少,生产慎用过低级别)。
- 必要时开启跟踪定位瓶颈:执行 lsnrctl trace start,完成后 lsnrctl trace stop,在 $ORACLE_HOME/network/log 下分析跟踪文件。
- 变更配置后优先使用 lsnrctl reload 让监听动态加载,减少中断(需要保证语法正确)。
二 日志与诊断优化
- 现象与风险:当 listener.log 过大或磁盘写入受阻时,lsnrctl status/start/stop 与客户端连接会出现明显卡顿或超时。部分旧系统/文件系统对单文件大小有限制(如 FAT16 2GB、FAT32 4GB),更容易触发异常。
- 安全清理步骤(滚动备份 + 在线切换):
- 进入监听命令行:lsnrctl
- 关闭日志:set log_status off
- 备份并重命名日志:在 $ORACLE_HOME/network/log 或 diag 对应目录执行
- mv listener.log listener.log.$(date +%F)
- 重新开启日志:set log_status on(会自动新建 listener.log)
- 退出:exit
- 建议:将日志轮转纳入日常维护(如按日归档、保留 7–31 天),避免再次膨胀。
- 诊断提示:若清理后仍然缓慢,可短时开启跟踪 lsnrctl trace start 抓取细节,分析完成务必 lsnrctl trace stop。
三 网络与解析优化
- 禁用或优化 DNS 反向解析:在 /etc/resolv.conf 中注释不必要的 nameserver 行,或配置 /etc/nsswitch.conf 让 hosts 优先解析,避免监听在建立连接时进行慢速 DNS 查询。
- 连接建立阶段的网络优化:在 listener.ora 中为监听地址启用 TCP/IP 快速打开 TCP Fast Open(TFO),可减少三次握手往返时间(需内核与网络侧同时支持)。示例片段:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = your_host)(PORT = 1521)(QUEUESIZE = 100)(SEND_BUF_SIZE = 65536)(RECV_BUF_SIZE = 65536)(TCP_FASTOPEN = 5))
)
)
说明:QUEUESIZE 提升待处理连接队列,SEND/RECV_BUF_SIZE 调整套接字缓冲,TCP_FASTOPEN 启用 TFO(数值为队列长度)。修改后执行 lsnrctl reload。
- 系统层面:确保服务器与数据库就近部署、网络带宽充足、延迟低,避免监听器成为链路瓶颈。
四 连接与队列调优
- 增大监听待处理队列:在 listener.ora 的监听地址上设置 QUEUESIZE(如 100–1024),缓解突发连接洪峰导致的丢连接或超时。
- 启用跟踪级别定位连接瓶颈:在问题时段短时执行 lsnrctl trace start,完成后 lsnrctl trace stop 并分析生成的跟踪文件。
- 变更生效方式:优先 lsnrctl reload;若涉及地址/协议变更,使用 lsnrctl stop/start。
- 关联参数提示:数据库侧如 SESSIONS_PER_USER 等与会话并发相关,可按需评估,但不属于监听器的直接配置项。
五 维护与监控脚本示例
- 日志轮转脚本(示例,按日归档并保留 7 天):
#!/bin/bash
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
LOGDIR=$ORACLE_HOME/network/log
BACKDIR=$LOGDIR/archive
mkdir -p $BACKDIR
DATE=$(date +%F)
lsnrctl <<EOF
set log_status off
EOF
mv $LOGDIR/listener.log $BACKDIR/listener.log.$DATE
lsnrctl <<EOF
set log_status on
EOF
find $BACKDIR -name “listener.log.*” -mtime +7 -delete
- 监控建议:
- 持续观察 listener.log 增长与磁盘使用(如 du -sh、tail -f)。
- 使用系统工具监控资源:top/vmstat/iostat/netstat;必要时结合 Prometheus/Grafana/Zabbix 做可视化告警。