Ubuntu 16.04 sudo w/NIS 太慢,bind(2) 很多端口,并且在 NIS 域服务器之间保留了很多连接

Ubuntu 16.04 sudo w/NIS 太慢,bind(2) 很多端口,并且在 NIS 域服务器之间保留了很多连接

标题说明了一切。无论如何,我刚刚将我的服务器从 14.04 LTS 升级到 16.04 LTS,我意识到 sudo 的运行速度比 14.04 慢得多。

我进行了跟踪并得到了以下结果:

$ sudo strace sudo true

---------------------------- 剪辑 -------------------------------

...
套接字(PF_INET,SOCK_STREAM,IPPROTO_TCP)=9
bind(9,{sa_family=AF_INET,sin_port=htons(722),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
bind(9,{sa_family=AF_INET,sin_port=htons(723),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
bind(9,{sa_family=AF_INET,sin_port=htons(724),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
bind(9,{sa_family=AF_INET,sin_port=htons(725),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
bind(9,{sa_family=AF_INET,sin_port=htons(726),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
bind(9,{sa_family=AF_INET,sin_port=htons(727),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
bind(9,{sa_family=AF_INET,sin_port=htons(728),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
bind(9,{sa_family=AF_INET,sin_port=htons(729),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
bind(9,{sa_family=AF_INET,sin_port=htons(730),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
bind(9,{sa_family=AF_INET,sin_port=htons(731),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
bind(9,{sa_family=AF_INET,sin_port=htons(732),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
bind(9,{sa_family=AF_INET,sin_port=htons(733),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
bind(9,{sa_family=AF_INET,sin_port=htons(734),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
bind(9,{sa_family=AF_INET,sin_port=htons(735),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
bind(9,{sa_family=AF_INET,sin_port=htons(736),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
bind(9,{sa_family=AF_INET,sin_port=htons(737),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
bind(9,{sa_family=AF_INET,sin_port=htons(738),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
bind(9,{sa_family=AF_INET,sin_port=htons(739),sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (地址已被使用)
...

---------------------------- 剪辑 -------------------------------

sudo 命令本身成功了,只是花费的时间太长,比如 5 秒。

端口范围是 512-1023,似乎它试图绑定特权端口以保证它具有超级用户权限。

并且sudo成功后,netstat -an显示:

---------------------------- 剪辑 -------------------------------

...
tcp 0 0 192.168.0.10:959 192.168.0.1:617 TIME_WAIT  
tcp 0 0 192.168.0.10:910 192.168.0.1:617 TIME_WAIT  
tcp 0 0 192.168.0.10:932 192.168.0.1:617 TIME_WAIT  
tcp 0 0 192.168.0.10:34470 192.168.0.1:111 TIME_WAIT  
tcp 0 0 192.168.0.10:966 192.168.0.1:617 TIME_WAIT  
tcp 0 0 192.168.0.10:903 192.168.0.1:617 TIME_WAIT  
tcp 0 0 192.168.0.10:875 192.168.0.1:617 TIME_WAIT  
tcp 0 0 192.168.0.10:45452 192.168.0.1:111 TIME_WAIT  
tcp 0 0 192.168.0.10:970 192.168.0.1:617 TIME_WAIT  
tcp 0 0 192.168.0.10:907 192.168.0.1:617 TIME_WAIT  
tcp 0 0 192.168.0.10:41063 192.168.0.1:111 TIME_WAIT  
tcp 0 0 192.168.0.10:45659 192.168.0.1:111 TIME_WAIT  
tcp 0 0 192.168.0.10:948 192.168.0.1:617 TIME_WAIT  
tcp 0 0 192.168.0.10:50370 192.168.0.1:111 TIME_WAIT  
tcp 0 0 192.168.0.10:56145 192.168.0.1:111 TIME_WAIT  
tcp 0 0 192.168.0.10:929 192.168.0.1:617 TIME_WAIT  
tcp 0 0 192.168.0.10:909 192.168.0.1:617 TIME_WAIT  
tcp 0 0 192.168.0.10:33648 192.168.0.1:111 TIME_WAIT  
tcp 0 0 192.168.0.10:33556 192.168.0.1:111 TIME_WAIT  
tcp 0 0 192.168.0.10:55209 192.168.0.1:111 TIME_WAIT  
tcp 0 0 192.168.0.10:975 192.168.0.1:617 TIME_WAIT  
tcp 0 0 192.168.0.10:969 192.168.0.1:617 TIME_WAIT  
tcp 0 0 192.168.0.10:35903 192.168.0.1:111 TIME_WAIT  
tcp 0 0 192.168.0.10:888 192.168.0.1:617 TIME_WAIT  
...

---------------------------- 剪辑 -------------------------------

其中 192.168.0.10 是我的服务器,192.168.0.1 是 NIS 服务器。

ypbind当我在服务器上停止并运行时sudo,不再观察到无用的 bind(2) 并且我的服务器和 NIS 服务器之间不再有 TIME_WAIT。

我无法停止ypbind,我非常想恢复我以前的敏捷sudo速度 B)

我能做些什么?

谢谢

答案1

我在使用 NIS 组和用户时也遇到了同样的问题。每次用户身份验证都非常慢。您也可以 tcpdump 客户端和 NIS 服务器之间的流量,并看到两者之间发生了异常的数据包风暴,在我的例子中持续了大约一分钟。

我尝试了一下配置,并想到了像 redhat 那样切换配置,这样可以非常快速地彻底改变 auth、login、sudo 的行为。只需从 /etc/passwd、/etc/shadow、/etc/group 和 nsswitch.conf 文件中删除“+::::”即可更改以下几行:

passwd:         files nis
group:          files nis
shadow:        files nis

告诉我进展如何。

答案2

在将几个系统升级到 16.04 LTS 后,我们遇到了同样的问题。我们使用 NIS 的兼容模式,通过 /etc/passwd 中的 +@netgroup 和 +user 选择性地选择较大的 NIS 域中的哪些人可以访问我们的系统。

我的同事(他应该得到所有的赞誉,但他没有做 StackExchange 的事情)找到了一种解决方法,可以让你保留兼容模式,并能够在 /etc/passwd 中使用 +@netgroup 和 +user。保留 passwd 和 shadow 的兼容模式,但在 /etc/nsswitch.conf 中使用“files nis”作为组:

passwd:    compat
shadow:    compat
group:     files nis

如果您想要做的只是包含整个 NIS 组图,则 /etc/group 的“compat”模式相当于“files nis”。

想知道这是否适合您的情况。

相关内容