Persistent changes to /proc/sys/sunrpc/tcp_slot_table_entries

I'm trying to make a persistent change to sunrpc.tcp_slot_table_entries on a Linux CentOS 5.5. This value has been found important for the performance of our NFS clients, and must be set before the NFS mounts are done.

Simply putting the value in /etc/sysctl.conf doesn't work because /etc/rc.d/rc.sysinit (which does the sysctl -p) is executed before the sunrpc module is loaded.

Same problem with 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" (maybe it has to be changed for CentOS 5) in /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...

4 ответа

Решение

Наконец, я создал почти фиктивный скрипт инициализации, вставленный на 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

Я использую RHEL5.4, и кажется, что каким-то образом настройки sysctl.conf применяются (как-то?) До того, как netfs монтирует тома. Как вы это проверили?

Я изменил initscript netfs, чтобы записать значение sunrpc.tcp_slot_table_entries до того, как были смонтированы nfs, и он записал "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

Я попробовал нечто похожее на то, что попробовал 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 $?

После этого параметр, кажется, надежно устанавливается после перезагрузки.

Вы могли бы поставить /sbin/sysctl -w sunrpc.tcp_slot_table_entries=64 в /etc/rc.d/rc.local,

Другие вопросы по тегам