目录
1、背景说明
2、排查
2.1、防火墙
2.2、超时时间设置
2.3、服务器资源检查
2.3.1、内存、CPU等
2.3.2、磁盘空间
编辑
2.3.3、检查文件描述符
2.3.4、swap区
3、增加swap空间
3.1、创建目录
3.2、格式化
3.3、启动swap
3.4、查看效果
1、背景说明
在一次服务日志检查中,发现RocketMQ生产者,在向MQ发送消息时出现向服务端发现消息超时错误:org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeout
Exception in thread "main" org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeout
at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:640)
at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1310)
at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1256)
at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:339)
2、排查
2.1、防火墙
如果是不同服务器之间、或者外网环境,检查防火墙设置
# 关闭防火墙
[root@localhost ~]# systemctl stop firewalld
# 查看防火墙状态
[root@localhost ~]# systemctl status firewalld
ubuntu操作系统使用
# 检查
(base) root@pd-2288H-V5:# service ufw status
● ufw.service - Uncomplicated firewall
Loaded: loaded (/lib/systemd/system/ufw.service; enabled; vendor preset: enabled)
Active: active (exited) since Tue 2024-06-11 17:06:23 CST; 1 weeks 2 days ago
Docs: man:ufw(8)
Process: 938 ExecStart=/lib/ufw/ufw-init start quiet (code=exited, status=0/SUCCESS)
Main PID: 938 (code=exited, status=0/SUCCESS)
Warning: journal has been rotated since unit was started, output may be incomplete.
2.2、超时时间设置
检查客户端初始化producer代码,在创建producer时,已经设置sendMsgTimeout时间。
默认producer.send(msg) 发送的超时时间3000ms
客户端与MQ都属于相同局域网,不存在网络阻塞,因此再增大超时时间并不合理
2.3、服务器资源检查
RemotingTooMuchRequestException问题出现时,MQ的并发并不大。
2.3.1、内存、CPU等
使用 top 命令
2.3.2、磁盘空间
MQ写入磁盘空间不足,也会导致消息写入失败
df -h
2.3.3、检查文件描述符
文件描述符是大于等于0的整数,其可以标明每一个被进程所打开的文件和 socket。最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应,后面打开的文件依此类推对应 3、4…… 。
从文件描述符的描述中得知,其是按照每个进程来分配的。于是上面的问题"我最多可以打开多少个文件"就可以进一步细化为下面几个问题
- 一个进程最多可以打开多少个文件描述符
- 一个用户最多可以打开多少个文件描述符
- 一个系统最多可以打开多少个文件描述符
# 数字替换应用的PID
ls /proc/3274080/fd | sort -n | tail -n 1
检查当前最大句柄数
# 查看
ulimit -n
# 修改句柄数
ulimit -n 10240
查看全部
ulimit -a
2.3.4、swap区
在进一步检查中发现swap 可用空间不足
3、增加swap空间
3.1、创建目录
使用dd命令在某个目录(实际使用时换成其他目录,/tmp目录的数据会在重启后丢失)下新建一个2G的文件:
解释:1M是单位,1024是数目,合计1024M就是总大小1G
如果不足,可以重复进行新建 /tmp/swap2 等等
dd if=/dev/zero of=/tmp/swap bs=1M count=2048
3.2、格式化
格式化这个文件为swap格式:(用mkswap命令)
mkswap /tmp/swap
3.3、启动swap
启动swap,用swapon命令(就是将新建的swap添加到系统)
swapon /tmp/swap
swapon: /tmp/swap2:不安全的权限 0644,建议使用 0600。
3.4、查看效果
用swapon的-s参数
swapon -s