Я пытаюсь постоянно менять sunrpc.tcp_slot_table_entries
в Linux CentOS 5.5. Это значение было признано важным для производительности наших клиентов 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 ...
Я использую RHEL5.4, и мне кажется, что каким-то образом настройки sysctl.conf применяются (каким-то образом?) До того, как netfs смонтирует тома. Как вы это проверили?
Я изменил сценарий netfs initscript, чтобы записать значение 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
Наконец, я создал почти фиктивный сценарий инициализации, вставленный в 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
Я пробовал что-то похожее на то, что пробовал 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
.