3

I set up a SMB/CIFS share on my FreeNAS box (Xeon E3-1220v5, 8GB DDR4 RAM) and I noticed that transfer rates are limited to ~70 MB/s, while I can easily get around 110 MB/s via WebDAV and using iperf I can achieve the complete theoretical maximum of my gigabit connection with ~940 MBit/s. The NIC is a "Intel Corporation Ethernet Connection (2) I219-LM (rev 31)" according to lspci.

My disks on both test computers are fast enough and could easily saturate the gigabit speeds. I checked the CPU and memory usage on the server side while transferring files and they both seem fine. It doesn't go higher than around 12% on the CPU. I also ran a ping test to get the average latency on the link to my server:

3221 packets transmitted, 3221 received, 0% packet loss, time 656878ms
rtt min/avg/max/mdev = 0.083/0.131/0.321/0.028 ms

My question is now, how can I find out what is limiting the speed from going higher? I was expecting at least something around 90 MB/s.


Here is the output of testparm -vvv:

# Global parameters
[global]
    bind interfaces only = No
    config backend = file
    dos charset = CP437
    enable core files = Yes
    interfaces = 
    multicast dns register = Yes
    netbios aliases = 
    netbios name = FREENAS
    netbios scope = 
    realm = 
    server services = s3fs, rpc, nbt, wrepl, ldap, cldap, kdc, drepl, winbindd, ntp_signd, kcc, dnsupdate, dns
    server string = FreeNAS Server
    share backend = classic
    unix charset = UTF-8
    workgroup = WORKGROUP
    browse list = Yes
    domain master = Auto
    enhanced browsing = Yes
    lm announce = Yes
    lm interval = 60
    local master = Yes
    os level = 20
    preferred master = Auto
    ads dns update = Yes
    allow dns updates = secure only
    dns forwarder = 
    dns update command = /usr/local/sbin/samba_dnsupdate
    machine password timeout = 604800
    nsupdate command = /usr/local/bin/samba-nsupdate -g
    rndc command = /usr/sbin/rndc
    spn update command = /usr/local/sbin/samba_spnupdate
    mangle prefix = 1
    mangling method = hash2
    max stat cache size = 256
    stat cache = Yes
    client ldap sasl wrapping = sign
    ldap admin dn = 
    ldap connection timeout = 2
    ldap delete dn = No
    ldap deref = auto
    ldap follow referral = Auto
    ldap group suffix = 
    ldap idmap suffix = 
    ldap machine suffix = 
    ldap page size = 1000
    ldap passwd sync = no
    ldap replication sleep = 1000
    ldap server require strong auth = Yes
    ldap ssl = start tls
    ldap ssl ads = No
    ldap suffix = 
    ldap timeout = 15
    ldap user suffix = 
    lock spin time = 200
    oplock break wait time = 0
    smb2 leases = No
    debug class = No
    debug hires timestamp = Yes
    debug pid = No
    debug prefix timestamp = No
    debug uid = No
    ldap debug level = 0
    ldap debug threshold = 10
    log file = 
    logging = file
    log level = 2
    max log size = 51200
    syslog = 1
    syslog only = No
    timestamp logs = Yes
    abort shutdown script = 
    add group script = 
    add machine script = 
    add user script = 
    add user to group script = 
    allow nt4 crypto = No
    delete group script = 
    delete user from group script = 
    delete user script = 
    domain logons = No
    enable privileges = Yes
    init logon delay = 100
    init logon delayed hosts = 
    logon drive = 
    logon home = \\%N\%U
    logon path = \\%N\%U\profile
    logon script = 
    reject md5 clients = No
    set primary group script = 
    shutdown script = 
    add share command = 
    afs token lifetime = 604800
    afs username map = 
    allow insecure wide links = No
    async smb echo handler = No
    auto services = 
    cache directory = /var/db/samba4
    change notify = Yes
    change share command = 
    cluster addresses = 
    clustering = No
    config file = 
    ctdbd socket = 
    ctdb locktime warn threshold = 0
    ctdb timeout = 0
    default service = 
    delete share command = 
    homedir map = auto.home
    kernel change notify = No
    lock directory = /var/lock
    log writeable files on exit = No
    message command = 
    nbt client socket address = 0.0.0.0
    ncalrpc dir = /var/run/samba4/ncalrpc
    NIS homedir = No
    nmbd bind explicit broadcast = Yes
    panic action = /usr/local/libexec/samba/samba-backtrace
    perfcount module = 
    pid directory = /var/run/samba
    registry shares = No
    remote announce = 
    remote browse sync = 
    reset on zero vc = No
    smbd profiling level = off
    state directory = /var/db/samba4
    usershare allow guests = No
    usershare max shares = 0
    usershare owner only = Yes
    usershare path = /var/db/samba4/usershares
    usershare prefix allow list = 
    usershare prefix deny list = 
    usershare template share = 
    utmp = No
    utmp directory = 
    wtmp directory = 
    addport command = 
    addprinter command = 
    cups connection timeout = 30
    cups encrypt = No
    cups server = 
    deleteprinter command = 
    disable spoolss = Yes
    enumports command = 
    iprint server = 
    load printers = No
    lpq cache time = 30
    os2 driver map = 
    printcap cache time = 750
    printcap name = /dev/null
    show add printer wizard = Yes
    cldap port = 389
    client ipc max protocol = default
    client ipc min protocol = default
    client max protocol = default
    client min protocol = CORE
    client use spnego = Yes
    dcerpc endpoint servers = epmapper, wkssvc, rpcecho, samr, netlogon, lsarpc, spoolss, drsuapi, dssetup, unixinfo, browser, eventlog6, backupkey, dnsserver
    defer sharing violations = Yes
    dgram port = 138
    disable netbios = No
    enable asu support = No
    eventlog list = 
    large readwrite = Yes
    max mux = 50
    max ttl = 259200
    max wins ttl = 518400
    max xmit = 65535
    min receivefile size = 0
    min wins ttl = 21600
    name resolve order = lmhosts wins host bcast
    nbt port = 137
    nt pipe support = Yes
    nt status support = Yes
    read raw = Yes
    rpc big endian = No
    server max protocol = SMB3
    server min protocol = LANMAN1
    server multi channel support = No
    smb2 max credits = 8192
    smb2 max read = 8388608
    smb2 max trans = 8388608
    smb2 max write = 8388608
    smb ports = 445 139
    svcctl list = 
    time server = Yes
    unicode = Yes
    unix extensions = Yes
    use spnego = Yes
    web port = 901
    write raw = Yes
    algorithmic rid base = 1000
    allow dcerpc auth level connect = No
    allow trusted domains = Yes
    auth methods = 
    check password script = 
    client ipc signing = default
    client lanman auth = No
    client NTLMv2 auth = Yes
    client plaintext auth = No
    client schannel = Auto
    client signing = default
    client use spnego principal = No
    dedicated keytab file = 
    encrypt passwords = Yes
    guest account = nobody
    kerberos method = default
    kpasswd port = 464
    krb5 port = 88
    lanman auth = No
    log nt token command = 
    map to guest = Bad User
    map untrusted to domain = No
    ntlm auth = Yes
    ntp signd socket directory = /var/run/samba4/ntp_signd
    null passwords = No
    obey pam restrictions = Yes
    old password allowed period = 60
    pam password change = No
    passdb backend = tdbsam
    passdb expand explicit = No
    passwd chat = *new*password* %n\n *new*password* %n\n *changed*
    passwd chat debug = No
    passwd chat timeout = 2
    passwd program = 
    password server = *
    preload modules = 
    private dir = /var/db/samba4/private
    raw NTLMv2 auth = No
    rename user script = 
    restrict anonymous = 0
    root directory = 
    samba kcc command = /usr/local/sbin/samba_kcc
    security = USER
    server role = standalone server
    server schannel = Auto
    server signing = default
    smb passwd file = /var/db/samba4/private/smbpasswd
    tls cafile = tls/ca.pem
    tls certfile = tls/cert.pem
    tls crlfile = 
    tls dh params file = 
    tls enabled = Yes
    tls keyfile = tls/key.pem
    tls priority = NORMAL:-VERS-SSL3.0
    tls verify peer = as_strict_as_possible
    unix password sync = No
    username level = 0
    username map = 
    username map cache time = 0
    username map script = 
    aio max threads = 100
    deadtime = 15
    getwd cache = Yes
    hostname lookups = Yes
    keepalive = 300
    max disk size = 0
    max open files = 233687
    max smbd processes = 0
    name cache timeout = 660
    socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=65536 SO_SNDBUF=65536
    use mmap = Yes
    get quota command = 
    host msdfs = Yes
    set quota command = 
    create krb5 conf = Yes
    idmap backend = tdb
    idmap cache time = 604800
    idmap gid = 
    idmap negative cache time = 120
    idmap uid = 
    neutralize nt4 emulation = No
    reject md5 servers = No
    require strong key = Yes
    template homedir = /home/%D/%U
    template shell = /bin/false
    winbind cache time = 300
    winbindd privileged socket directory = /var/run/samba4/winbindd_privileged
    winbindd socket directory = /var/run/samba4/winbindd
    winbind enum groups = No
    winbind enum users = No
    winbind expand groups = 0
    winbind max clients = 200
    winbind max domain connections = 1
    winbind nested groups = Yes
    winbind normalize names = No
    winbind nss info = template
    winbind offline logon = No
    winbind reconnect delay = 30
    winbind refresh tickets = No
    winbind request timeout = 60
    winbind rpc only = No
    winbind sealed pipes = Yes
    winbind separator = \
    winbind trusted domains only = No
    winbind use default domain = No
    dns proxy = No
    wins hook = 
    wins proxy = No
    wins server = 
    wins support = No
    idmap config *: range = 90000001-100000000
    idmap config * : backend = tdb
    comment = 
    path = 
    administrative share = No
    browseable = Yes
    case sensitive = Auto
    default case = lower
    delete veto files = No
    hide dot files = Yes
    hide files = 
    hide special files = No
    hide unreadable = No
    hide unwriteable files = No
    mangled names = Yes
    mangling char = ~
    map archive = Yes
    map hidden = No
    map readonly = yes
    map system = No
    preserve case = Yes
    short preserve case = Yes
    store dos attributes = Yes
    veto files = 
    veto oplock files = 
    blocking locks = Yes
    csc policy = manual
    fake oplocks = No
    kernel oplocks = No
    kernel share modes = Yes
    level2 oplocks = Yes
    locking = Yes
    oplock contention limit = 2
    oplocks = Yes
    posix locking = Yes
    strict locking = No
    afs share = No
    available = Yes
    copy = 
    delete readonly = No
    dfree cache time = 0
    dfree command = 
    directory name cache size = 0
    dmapi support = No
    dont descend = 
    dos filemode = Yes
    dos filetime resolution = No
    dos filetimes = Yes
    fake directory create times = No
    follow symlinks = Yes
    fstype = NTFS
    include = 
    magic output = 
    magic script = 
    postexec = 
    preexec = 
    preexec close = No
    root postexec = 
    root preexec = 
    root preexec close = No
    spotlight = No
    volume = 
    wide links = No
    cups options = 
    default devmode = Yes
    force printername = No
    lppause command = 
    lpq command = lpq -P'%p'
    lpresume command = 
    lprm command = lprm -P'%p' %j
    max print jobs = 1000
    max reported print jobs = 0
    printable = No
    print command = lpr -r -P'%p' %s
    printer name = 
    printing = bsd
    printjob username = %U
    print notify backchannel = No
    queuepause command = 
    queueresume command = 
    use client driver = No
    acl allow execute always = Yes
    acl check permissions = Yes
    acl map full control = Yes
    durable handles = Yes
    ea support = Yes
    map acl inherit = No
    nt acl support = Yes
    profile acls = No
    access based share enum = No
    acl group control = No
    admin users = 
    create mask = 0666
    directory mask = 0777
    force create mode = 0000
    force directory mode = 0000
    force group = 
    force unknown acl user = No
    force user = 
    guest ok = No
    guest only = No
    hosts allow = 
    hosts deny = 
    inherit acls = No
    inherit owner = No
    inherit permissions = No
    invalid users = 
    only user = No
    read list = 
    read only = Yes
    smb encrypt = default
    username = 
    valid users = 
    write list = 
    aio read size = 0
    aio write behind = 
    aio write size = 0
    allocation roundup size = 1048576
    block size = 1024
    max connections = 0
    min print space = 0
    strict allocate = No
    strict rename = No
    strict sync = No
    sync always = No
    use sendfile = No
    write cache size = 0
    msdfs proxy = 
    msdfs root = No
    msdfs shuffle referrals = No
    ntvfs handler = unixuid, default
    vfs objects = 

[...]

Here is a screenshot of top with activity per core when I transfer one big file:

top


Because of a suggestion from an answer, I enabled jumbo frames (9000) and increased the TCP window size to about 4 times higher numbers than what it was, but I still have no better results.


UPDATE: I set up a Fedora 25 machine and ran the same tests and for some reason I am getting the full gigabit speed there. So my guess is that it has to do with the protocol (?) Ubuntu (which I used for testing so far) is using.

comfreak
  • 1,451
  • 1
  • 21
  • 32
  • 1
    Do you have 8 processors? 12.5% equals 1/8. – kubanczyk Mar 04 '17 at 19:28
  • @kubanczyk The Xeon is a quad-core and also has 4 threads. So it should be more around 25%. – comfreak Mar 04 '17 at 19:56
  • The ~12% would make more sense on a E3-1230 or better with hyper-threading enabled but it could also be SpeedStep keeping the frequency low. – Brian Mar 04 '17 at 20:01
  • I don't see where you've checked individual CPU cores for activity. What does it look like when you run `top` and hit `1` to display activity per-core? You could be configured to use hyperthreading, which would fit nicely into that 12% value. If that's the case, you might be able to improve things by turning hyperthreading off and using only the four physical cores. – Spooler Mar 04 '17 at 21:30
  • @SmallLoanOf1M I updated my post with a screenshot of `top` during a file transfer with the option you mentioned. – comfreak Mar 04 '17 at 21:52

2 Answers2

1

Samba is single threaded. This often means being CPU bound depending on what options are selected / enabled.

Chapter 3. Samba Architecture

Brian
  • 3,386
  • 17
  • 16
  • But shouldn't I be seeing a higher CPU load then? My system is a quad-core (4 threads), so it should be higher than 12% or am I wrong? – comfreak Mar 04 '17 at 19:59
  • The CPU is 4 cores, no hyperthreading. 12% suggests one core is at 50%. It could be inefficiency in the code, not able to use a whole core. Could also perhaps be protocol overhead. – Tim Mar 04 '17 at 21:36
0

SMB servers often negotiate small network transfer size, between 4 KB and 32/64 KB.

If using Samba, try increasing the max xmit value. By default it is set to 16644 bytes, try setting it larger (for example, 65536).

EDIT: ok, let try some other parameters. If the don't work, you can comment/remove them:

  • set client max protocol = SMB2
  • set server max protocol = SMB2

If not already done, enable jumbo frames (at the network interface level) and set a large TCP windows size.

shodanshok
  • 44,038
  • 6
  • 98
  • 162