/proc/sys/sunrpc/tcp_slot_table_entries 的持久更改

/proc/sys/sunrpc/tcp_slot_table_entries 的持久更改

我正在尝试对 Linux CentOS 5.5 进行持久更改sunrpc.tcp_slot_table_entries。此值对于我们的 NFS 客户端的性能很重要,必须在 NFS 挂载完成之前设置。

简单地输入值/etc/sysctl.conf是行不通的,因为/etc/rc.d/rc.sysinit(执行 sysctl -p)是在加载 sunrpc 模块之前执行的。

RHEL 4 也有同样的问题:

我尝试过了:

  • 放入(并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 $?

此后,重启后该参数似乎能够可靠地设置。

相关内容