Problematická rychlost SAMBY

U FreeBSD 6.x a Samby 3.0.x jsem se potkal s určitými nedostatky výkonu. Podle informací v diskusních fórech se jednalo o problem implementace a tak byl částečně degradován výkon. Protože se mi stalo něco podobného, zkoušel jsem tento problém řešit úpravou nastavení. Pomohlo to jenom částečně, na síti 1Gb/s jsem se dostal alespoň na rychlost odpovídající třetině výkonu ethernetu (35MB/s). Postupem času se chování lepšilo, s příchodem FreeBSD 8.2 a Samba 3.6 jsem se postupnými úpravami dostal do stavu, popsaného níže.
HW/SW testovací konfigurace:
- Atom (deska supermicro)/4GB RAM
- onboard Intel dualport adapter
- řadič disků ARECA
- FreeBSD 8.2/i386

Diagnostika přístupu k diskovému poli: diskinfo -tv /dev/da0
/dev/da0
Seek times:
     Full stroke: 250 iter in 4.833226 sec = 19.333 msec
     Half stroke: 250 iter in 4.454185 sec = 17.817 msec
     Quarter stroke: 500 iter in 3.755233 sec = 7.510 msec
     Short forward: 400 iter in 1.323541 sec = 3.309 msec
     Short backward: 400 iter in 3.371633 sec = 8.429 msec
     Seq outer: 2048 iter in 0.599982 sec = 0.293 msec
     Seq inner: 2048 iter in 0.335802 sec = 0.164 msec
Transfer rates:
     outside: 102400 kbytes in 0.254936 sec = 401669 kbytes/sec
     middle: 102400 kbytes in 0.540097 sec = 189596 kbytes/sec
     inside: 102400 kbytes in 0.520260 sec = 196825 kbytes/sec

V uvedené testovací konfiguraci je použit souborový systém ZFS, testy čtení a zápisu velkého souboru ukazují na následující hodnoty:
# dd if=/dev/zero of=test2 bs=1M count=1024 | grep sec
1073741824 bytes transferred in 5.904555 secs (181 849 743 bytes/sec)
# dd if=test2 of=/dev/zero bs=1M count=1024 | grep sec
1073741824 bytes transferred in 2.850506 secs (376 684 630 bytes/sec)


Výstupy testů síťové konmunikace (průměry z deseti testů)
TTCP:
- obousměrně 123,8MB/s
FTP:
- čtení 123,1MB/s
- zápis 122,8MB/s
SMB: (v závislosti na zatížení, důvod degradace zápisu je zatím neznámý)
- download ~ 100MB/s (rozptyl 5%)
- upload ~ 80MB/s (rozptyl 22%)

S nastavením je nutné trochu experimentovat. Tzn velikost bufferů a další drobnosti. Vetšinou jsem používal změny velikosti bufferu v krocích 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288 a zjšťoval jsem vyslednou propustnost. Zde je podoba nastavení pro /usr/local/etc/smb.conf (je nutné hodně experimentovat, silně záleží na konfiguraci systému):
max xmit = 65535
max mux = 256
socket options = socket options = SO_KEEPALIVE TCP_NODELAY IPTOS_LOWDELAY IPTOS_THROUGHPUT SO_SNDBUF=131072 SO_RCVBUF=131072
max protocol = SMB2
read raw = Yes
write raw = yes
use sendfile = true
min receivefile size = 16384
aio read size = 65536
aio write size = 65536
aio write behind = yes

případně vypnout oportunity locking pomocí
oplocks = no
level2 oplocks = no

Pro použití AIO Read/Write je nutné do souboru /boot/loader.conf přidat:
aio_load="YES"

Samozřejmostí je potřeba pohrát si s nastavením síťového interface. Začátkem je nastavení v souboru /etc/rc.conf:
ifconfig_emx="PRIVATE.IP.ADDRESS.RANK-C/24" ipv6_enable="YES"
tcp_extensions="YES"

Pokud karta podporuje nějakou hardware funkcionalitu a chceme ji využít, je možné vytvořit soubor s názvem interface, který ji povolí. Například /etc/start_if.em0:
/sbin/ifconfig em0 rxcsum txcsum tso lro

Osobně doporučuji serverovou edici Intel karet (emx), které mají hardware buffery pro komunikaci (4096 bufferů, kde je 2048 Tx a 2048 Rx), funkcionalitu TCP Offload (výpočty CRC součtů atd), podporují Flow-Control a jumbo frame na úrovni hardware. V případě náročnější komunikace nabízí tato karta nižší zátěž procesoru a vyšší výkon. V ideálním případě by celá cesta (server - switch - desktop) měl tuto funkcionalitu podporovat, jinak se nevyplatí ji zapínat. Testy, které mne mne k tomuto závěru vedou někdy možná rozepíšu.

A dále je nutné si pohrát s nastavením hodnot pro síťovou komunikaci, pro příklad z /boot/loader.conf:
net.inet.tcp.tcbhashsize="4096"
net.inet.tcp.hostcache.hashsize="1024"
kern.hz=1000

A další část nastavení TCP/IP z /etc/sysctl.conf:
net.inet.flowtable.enable=1
net.inet.flowtable.nmbflows=65535
net.inet.ip.fastforwarding=1
net.inet.ip.forwarding=1
net.inet.ip.intr_queue_maxlen=4096
net.inet.tcp.blackhole=2
net.inet.tcp.delacktime=100
net.inet.tcp.delayed_ack=0
net.inet.tcp.ecn.enable=1
net.inet.tcp.fast_finwait2_recycle=1
net.inet.tcp.hostcache.expire=3900
net.inet.tcp.inflight.debug=0
net.inet.tcp.inflight.enable=1
net.inet.tcp.inflight.min=6144
net.inet.tcp.inflight.min=8192
net.inet.tcp.local_slowstart_flightsize=10
net.inet.tcp.local_slowstart_flightsize=128
net.inet.tcp.local_slowstart_flightsize=16
net.inet.tcp.maxtcptw=131072
net.inet.tcp.mssdflt=1460
net.inet.tcp.nolocaltimewait=1
net.inet.tcp.path_mtu_discovery=0
net.inet.tcp.path_mtu_discovery=1
net.inet.tcp.recvbuf_inc=65536
net.inet.tcp.recvbuf_max=16777216
net.inet.tcp.recvspace=131072
net.inet.tcp.recvspace=16384
net.inet.tcp.rfc1323=1
net.inet.tcp.sendbuf_inc=65536
net.inet.tcp.sendbuf_max=16777216
net.inet.tcp.sendspace=131072
net.inet.tcp.sendspace=16384
net.inet.tcp.slowstart_flightsize=128
net.inet.tcp.slowstart_flightsize=54
net.inet.udp.blackhole=1
net.inet.udp.maxdgram=8192
net.inet.udp.recvspace=131072
net.inet.udp.recvspace=16384
net.inet.udp.sendspace=131072
net.inet6.icmp6.nodeinfo=0
net.inet6.icmp6.rediraccept=0
net.inet6.ip6.accept_rtadv=0
net.inet6.ip6.auto_linklocal=0
net.inet6.ip6.prefer_tempaddr=1
net.inet6.ip6.use_tempaddr=1
net.local.stream.recvspace=134144
net.local.stream.recvspace=16384
net.local.stream.sendspace=134144
net.local.stream.sendspace=16384

Mimo nastavení pro komunikaci je také nutné se věnovat přístupu k souborovému systému a procesům v /etc/sysctl.conf:
kern.ipc.maxsockbuf=16777216
kern.ipc.maxsockets=131072
kern.ipc.nmbclusters=32768
kern.ipc.shmall=8388608
kern.ipc.shmmax=67108864
kern.ipc.somaxconn=8192
kern.maxfiles=131072
kern.maxfilesperproc=16384
kern.maxfilesperproc=65536
kern.maxproc=16384
kern.maxvnodes=262144
kern.threads.max_threads_per_proc=4096

Rozšíření pro ZFS v /etc/sysctl.conf:
vfs.zfs.prefetch_disable=0


Rozšíření pro ZFS v /boot/loader.conf:
vm.kmem_size="512M"
vm.kmem_size_max="1G"
vm.kmem_size_min="256M"
vfs.zfs.prefetch.disable=0


Bližší informace je možné najít na stránkách:
http://us1.samba.org/samba/docs/man/Samba-HOWTO-Collection/speed.html
http://www.jalix.org/ressources/reseaux/nfs-samba/samba/_docs/faq.html

Malá poznámka na okraj: Protože propustnost je daná nejužším hrdlem, je vhodné si spočítat také propustnost danou disky - viz Výpočet propustnosti disků

Powered by Drupal - Design by artinet