我正在尝试对 Linux CentOS 5.5 进行持久更改sunrpc.tcp_slot_table_entries
。此值对于我们的 NFS 客户端的性能很重要,必须在 NFS 挂载完成之前设置。
简单地输入值/etc/sysctl.conf
是行不通的,因为/etc/rc.d/rc.sysinit
(执行 sysctl -p)是在加载 sunrpc 模块之前执行的。
RHEL 4 也有同样的问题:
- http://amitgud.blogspot.com/2006/07/sysctl-for-late-comers.html
- https://bugzilla.redhat.com/show_bug.cgi?id=189311
我尝试过了:
- 放入(并
install sunrpc /sbin/modprobe -q --ignore-install sunrpc;/sbin/sysctl -w sunrpc.tcp_slot_table_entries=64
放入)/etc/modprobe.conf
/etc/modprobe.d/sunrpc
- 放入
SUBSYSTEM=="module" ACTION=="add" DEVPATH=="*/sunrpc" RUN+="/sbin/sysctl -w sunrpc.tcp_slot_table_entries=64"
(也许必须针对 CentOS 5 进行更改)/etc/udev/rules.d/23-sunrpc.rules
但无济于事。
我不想修改/etc/init.d/netfs
(来自 initscripts 包)。
那么,您是否已成功在 CentOS 5 上正确完成此操作?如果是,如何操作?
编辑:发现于/etc/modprobe.d/modprobe.conf.dist
:
install sunrpc /sbin/modprobe --first-time --ignore-install sunrpc && { /bin/mount -t rpc_pipefs sunrpc /var/lib/nfs/rpc_pipefs > /dev/null 2>&1 || :; }
这也许就是为什么我自己对 modprobe 的添加没有被考虑的原因。但我不确定是否应该直接修改该文件,因为它可能会被 module-init-tools 更新覆盖...
答案1
最后,我创建了一个几乎虚拟的初始化脚本,插入到 S15(参见 /etc/rc3.d/),因为该模块在 S14(nfslock)中加载并在 S25(netfs)中使用。
/etc/init.d/sunrpc_tuning
:
#!/bin/sh
#
# sunrpc_tuning Tunes /proc/sys/sunrpc (launched after lockd)
#
# chkconfig: 345 15 85
# description: set values to sunrpc after module is loaded
# probe: true
case "$1" in
start)
echo "Setting sunrpc.tcp_slot_table_entries ..."
/sbin/sysctl -w sunrpc.tcp_slot_table_entries=128
;;
*) ;;
esac
然后:
chkconfig --add sunrpc_tuning
答案2
我正在运行 RHEL5.4,似乎在 netfs 挂载卷之前以某种方式应用了 sysctl.conf 设置(不知何故?)。您是如何验证这一点的?
我修改了 netfs 初始化脚本,在 nfs 挂载操作之前写入 sunrpc.tcp_slot_table_entries 值,它写出了“128”而不是默认值“16”。
start)
# Let udev handle any backlog before trying to mount file systems
/sbin/udevsettle --timeout=30
[ -n "$NFSFSTAB" ] &&
{
[ ! -f /var/lock/subsys/portmap ] && service portmap start
/sbin/sysctl sunrpc.tcp_slot_table_entries >> /tmp/sunrpc
action $"Mounting NFS filesystems: " mount -a -t nfs,nfs4
答案3
您可以/sbin/sysctl -w sunrpc.tcp_slot_table_entries=64
输入/etc/rc.d/rc.local
。
答案4
我尝试过与 David142 类似的方法,这是在 RedHat 6.3 系统上,但我发现即使在 S15 或 S20 上,它仍然无法启动,因为 sunrpc 内核模块未加载。即使 S52netfs 启动并尝试执行 sysctl -p,它也会失败。
我尝试的修复方法与您的类似,但我添加了 modprobe 命令:
#!/bin/bash
#
# set_nfs_parms Set kernel parmeters for NFS
#
# chkconfig: 235 15 85
# description: At boot time, sunrpc.tcp_slot_table_entries cannot be set since
# the nfs module is not loaded. This sets it later in the boot
# sequence.
#
# Source function library.
. /etc/rc.d/init.d/functions
case "$1" in
start)
#/sbin/sysctl -w sunrpc.tcp_slot_table_entries=128
/sbin/modprobe sunrpc
/sbin/sysctl -p
;;
stop)
;;
*)
echo $"Usage: $0 {start}"
exit 2
esac
exit $?
此后,重启后该参数似乎能够可靠地设置。