标题说明了一切。无论如何,我刚刚将我的服务器从 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”。
想知道这是否适合您的情况。