温馨提示×

如何用centos lsnrctl优化性能

小樊
32
2026-01-02 05:02:27
栏目: 智能运维

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),更容易触发异常。
  • 安全清理步骤(滚动备份 + 在线切换):
    1. 进入监听命令行:lsnrctl
    2. 关闭日志:set log_status off
    3. 备份并重命名日志:在 $ORACLE_HOME/network/logdiag 对应目录执行
      • mv listener.log listener.log.$(date +%F)
    4. 重新开启日志:set log_status on(会自动新建 listener.log)
    5. 退出: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 -shtail -f)。
    • 使用系统工具监控资源:top/vmstat/iostat/netstat;必要时结合 Prometheus/Grafana/Zabbix 做可视化告警。

0