can't identify protocol问题的定位和解决

在观摩了一个关于性能问题排查的PPT之后试着用lsof命令来列举linux系统打开的文件,

然后发现出现了很多“ can't identify protocol ” 的信息:

 

udevd 3117 root 989u sock 0,4 84579 can't identify protocol
udevd 3117 root 990u sock 0,4 84632 can't identify protocol
udevd 3117 root 991u sock 0,4 84757 can't identify protocol
udevd 3117 root 992u sock 0,4 84836 can't identify protocol
udevd 3117 root 993u sock 0,4 84899 can't identify protocol
udevd 3117 root 994u sock 0,4 85018 can't identify protocol
udevd 3117 root 995u sock 0,4 85135 can't identify protocol
udevd 3117 root 996u sock 0,4 85172 can't identify protocol
udevd 3117 root 997u sock 0,4 85213 can't identify protocol
udevd 3117 root 998u sock 0,4 85318 can't identify protocol

 

 

可以看到这都是由于3117进程打印出来的,于是使用strace命令追中该进程号:

 

[root@localhost ~]# strace -p 3117
Process 3117 attached - interrupt to quit
select(0, [], [], NULL, {0, 168000}) = 0 (Timeout)
time([1349686960]) = 1349686960
select(0, [], [], NULL, {1, 0}) = 0 (Timeout)
time([1349686961]) = 1349686961
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = -1 EMFILE (Too many open files)
select(0, [], [], NULL, {1, 0}) = 0 (Timeout)
time([1349686962]) = 1349686962
select(0, [], [], NULL, {1, 0}) = 0 (Timeout)
time([1349686963]) = 1349686963
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = -1 EMFILE (Too many open files)
select(0, [], [], NULL, {1, 0}) = 0 (Timeout)
time([1349686964]) = 1349686964
select(0, [], [], NULL, {1, 0}) = 0 (Timeout)
time([1349686965]) = 1349686965
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = -1 EMFILE (Too many open files)
 

 

于是追踪到“Too many open files”错误。

到这里,就很明白了,是进程打开文件句柄的个数达到了linux的限制。

 

而这种限制分为系统层面的和用户层面的:

系统层面的在:/proc/sys/fs/file-max里设置

 

[root@localhost ~]# cat /proc/sys/fs/file-max
1602508
 

 

用户层面的限制在:/etc/security/limits.conf里设定

使用 ulimit -a 查看系统允许单个进程打开的最大文件数:

 

[root@localhost ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
pending signals (-i) 1024
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 278528
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

 

注意“open files (-n) 1024” 这一行,系统只允许每个非root用户(运行不是系统级别的程序一般都是非root用户来启动的)打开1024个文件。

 

 

既然问题找到,那就只要把这个值改大就好了,可以使用这两种方法:

1、临时修改

· ulimit -n 131072(重启无效)

· 在/etc/rc/rc.local里加入ulimit -n 131072

 

2、永久修改

在/etc/security/limits.conf文件里加入以下内容,重启生效:

* soft nofile 131072
* hard nofile 131072

 

你也可以零时修改和永久修改一起进行,这样重启系统之后还能保持一样的open files限制。

 

—— EOF ——

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
“无法识别协议”是一个错误信息,通常在网络连接或数据传输过程中出现。它表示无法识别使用的通信协议。 在网络通信过程中,不同的协议负责处理不同的任务,例如传输控制协议(TCP)用于在网络之间建立可靠的连接,而网际协议(IP)用于将数据包从一个网络传输到另一个网络。当出现“无法识别协议”的错误时,可能是由以下原因导致的: 1. 被防火墙阻止:某些防火墙可能会禁止一些不常见或未知的协议通过网络。如果您在尝试使用这些协议时遇到问题,可能是因为防火墙正在阻止该协议的传输。 2. 版本不匹配:如果网络连接的两端使用的协议版本不匹配,就会导致协议无法识别。这可能是由于软件版本过旧或过时导致的。 3. 错误的配置:如果网络设备或服务器的协议配置有误,可能导致协议无法识别。这可能是由于配置文件错误或设置不正确导致的。 要解决“无法识别协议”的问题,您可以尝试以下方法: 1. 检查网络连接是否正常,确保所有设备都已正确连接。 2. 检查防火墙设置,并确保未禁用所需的协议。 3. 更新软件和驱动程序,以确保使用最新的协议版本。 4. 检查网络设备和服务器的协议配置,并进行必要的更改。 如果以上方法无效,您可能需要与网络管理员或技术支持团队联系,以获取进一步的帮助和支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值