目录
一、环境信息
二、问题描述
三、问题截图
四、问题分析
1、线程查找
2、会话视图查看
3、CREATE类型描述
4、进程打开文件数
5、连接IP查看
五、解决方法
一、环境信息
| 名称 | 值 |
| CPU | x86 |
| 操作系统 | KylinV10 |
| DM版本 | DM Database Server 64 V8 |
二、问题描述
生产环境备节点日志大量打印告警:EMFILE error! The per-process limit of open file descriptors has been reached。
三、问题截图
我们可以看到是924661、924662两个线程打印的告警。
四、问题分析
1、线程查找
dm_sched_thd :调度线程,每秒钟轮询一次,主要负责接管数据库内部所有需要定时调度的任务,调度线程具备唤醒工作线程、向任务队列中添加任务队列、动态缓冲区检查、SQL缓存清理等权限。
dm_lsnr_thd :达梦数据库中监听线程的监听端口范围为1024 - 65534;默认监听的端口为5236,主要的任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。它在系统启动完成后才启动,并且在系统关闭时首先被关闭。为了保证在处理大量客户连接时系统具有较短的响应时间,监听线程比普通线程优先级更高。
大部分都是监听线程在报,所以查一下相关会话视图。
2、会话视图查看
很多CREATE类型的连接。
3、CREATE类型描述
4、进程打开文件数
ll /proc/`pidof dmserver`/fd |wc -l我这边只截取了一分部,打开文件数在1W-6W之间波动,说明达梦的日志告警无误。
5、连接IP查看
ss -tanp |grep ':5236'关注SYN-RECV状态的201结尾的IP就是需要去关注的。
| 列名 | 含义 | 说明 / 常见值 |
|---|---|---|
State | TCP 连接状态 | LISTEN(监听)、ESTAB(已建立)、TIME-WAIT、CLOSE-WAIT、SYN-SENT等 |
Recv-Q | 接收队列 | 对LISTEN:已完成握手但未被accept()的连接数;对已连接:应用未读取的数据字节数 |
Send-Q | 发送队列 | 对LISTEN:监听队列最大长度,即backlog;对已连接:已发送但未被对端 ACK 的数据字节数 |
Local Address:Port | 本地地址和端口 | 如0.0.0.0:5236监听所有 IPv4;[::]:5236监听所有 IPv6;127.0.0.1:5236仅本机回环 |
Peer Address:Port | 对端地址和端口 | LISTEN状态通常为0.0.0.0:*或[::]:*;已连接时为客户端 IP 和端口 |
Process | 占用该套接字的进程信息 | 如users:(("mysqld",pid=1234,fd=32));权限不足时可能为空或显示- |
| 状态显示 | 全称 | 含义 | 常见场景 |
|---|---|---|---|
LISTEN | Listen | 监听状态,等待客户端连接请求 | 服务器端套接字,通常用-l查看 |
SYN-SENT | SYN Sent | 已发送 SYN,等待对端确认,正在建立连接 | 客户端发起连接时的中间状态 |
SYN-RECV | SYN Received | 已收到 SYN 并回复 SYN+ACK,等待最后 ACK | 服务器端收到连接请求后的中间状态 |
ESTAB | Established | 连接已建立,可以正常传输数据 | 正常的活跃连接 |
FIN-WAIT-1 | FIN Wait 1 | 主动关闭方已发送 FIN,等待 ACK 或对端 FIN | 本地主动关闭连接 |
FIN-WAIT-2 | FIN Wait 2 | 主动关闭方已收到 ACK,等待对端发送 FIN | 本地主动关闭连接,对端尚未关闭 |
CLOSE-WAIT | Close Wait | 被动关闭方收到 FIN 并回复 ACK,等待本地应用关闭连接 | 对端关闭了连接,但本地应用还未关闭 |
CLOSING | Closing | 双方同时关闭,收到 FIN 后发送 ACK,等待 ACK | 双方同时尝试关闭连接 |
LAST-ACK | Last Acknowledgment | 被动关闭方已发送 FIN,等待最后一个 ACK | 被动关闭方准备完成关闭 |
TIME-WAIT | Time Wait | 主动关闭方完成关闭后,等待 2MSL 处理残留数据包 | 连接关闭后短暂保留,常见于高并发短连接 |
CLOSED | Closed | 连接已完全关闭 | 通常不会在ss输出中显示,因为套接字已释放 |
UNKNOWN | Unknown | 状态未知或无法识别 | 少见,可能因权限或内核状态异常 |
五、解决方法
CREATE 类型,表示"会话对象已创建,但还不能使用"。该状态的主要原因是客户端驱动版本与数据库服务器版本不匹配,导致网络通信异常,会话在建立过程中无法完成初始化流程,从而停留在 CREATE 状态。
具体来说,当客户端使用的达梦数据库驱动版本过低或与服务器端不兼容时,连接建立过程中的消息交互可能出现异常,使得会话对象虽然已在内存中创建,但无法进入正常的启动(STARTUP)或空闲(IDLE)状态,最终表现为大量 CREATE 状态的会话。
建议是将ss命令排查到的IP所部署的连接数据库程序更换最新的驱动。
最新驱动链接:《达梦数据库-学习-36-API驱动下载汇总》