mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
273 lines
9.6 KiB
Plaintext
273 lines
9.6 KiB
Plaintext
|
This file tries to outline the ways to improve the speed of a Samba server.
|
||
|
|
||
|
Andrew Tridgell
|
||
|
January 1995
|
||
|
|
||
|
|
||
|
COMPARISONS
|
||
|
-----------
|
||
|
|
||
|
The Samba server uses TCP to talk to the client. Thus if you are
|
||
|
trying to see if it performs well you should really compare it to
|
||
|
programs that use the same protocol. The most readily available
|
||
|
programs for file transfer that use TCP are ftp or another TCP based
|
||
|
SMB server.
|
||
|
|
||
|
If you want to test against something like a NT or WfWg server then
|
||
|
you will have to disable all but TCP on either the client or
|
||
|
server. Otherwise you may well be using a totally different protocol
|
||
|
(such as Netbeui) and comparisons may not be valid.
|
||
|
|
||
|
Generally you should find that Samba performs similarly to ftp at raw
|
||
|
transfer speed. It should perform quite a bit faster than NFS,
|
||
|
although this very much depends on your system.
|
||
|
|
||
|
Several people have done comparisons between Samba and Novell, NFS or
|
||
|
WinNT. In some cases Samba performed the best, in others the worst. I
|
||
|
suspect the biggest factor is not Samba vs some other system but the
|
||
|
hardware and drivers used on the various systems. Given similar
|
||
|
hardware Samba should certainly be competitive in speed with other
|
||
|
systems.
|
||
|
|
||
|
|
||
|
SOCKET OPTIONS
|
||
|
--------------
|
||
|
|
||
|
There are a number of socket options that can greatly affect the
|
||
|
performance of a TCP based server like Samba.
|
||
|
|
||
|
The socket options that Samba uses are settable both on the command
|
||
|
line with the -O option, or in the smb.conf file.
|
||
|
|
||
|
The "socket options" section of the smb.conf manual page describes how
|
||
|
to set these and gives recommendations.
|
||
|
|
||
|
Getting the socket options right can make a big difference to your
|
||
|
performance, but getting them wrong can degrade it by just as
|
||
|
much. The correct settings are very dependent on your local network.
|
||
|
|
||
|
The socket option TCP_NODELAY is the one that seems to make the
|
||
|
biggest single difference for most networks. Many people report that
|
||
|
adding "socket options = TCP_NODELAY" doubles the read performance of
|
||
|
a Samba drive. The best explanation I have seen for this is that the
|
||
|
Microsoft TCP/IP stack is slow in sending tcp ACKs.
|
||
|
|
||
|
|
||
|
READ SIZE
|
||
|
---------
|
||
|
|
||
|
The option "read size" affects the overlap of disk reads/writes with
|
||
|
network reads/writes. If the amount of data being transferred in
|
||
|
several of the SMB commands (currently SMBwrite, SMBwriteX and
|
||
|
SMBreadbraw) is larger than this value then the server begins writing
|
||
|
the data before it has received the whole packet from the network, or
|
||
|
in the case of SMBreadbraw, it begins writing to the network before
|
||
|
all the data has been read from disk.
|
||
|
|
||
|
This overlapping works best when the speeds of disk and network access
|
||
|
are similar, having very little effect when the speed of one is much
|
||
|
greater than the other.
|
||
|
|
||
|
The default value is 16384, but very little experimentation has been
|
||
|
done yet to determine the optimal value, and it is likely that the best
|
||
|
value will vary greatly between systems anyway. A value over 65536 is
|
||
|
pointless and will cause you to allocate memory unnecessarily.
|
||
|
|
||
|
|
||
|
MAX XMIT
|
||
|
--------
|
||
|
|
||
|
At startup the client and server negotiate a "maximum transmit" size,
|
||
|
which limits the size of nearly all SMB commands. You can set the
|
||
|
maximum size that Samba will negotiate using the "max xmit = " option
|
||
|
in smb.conf.
|
||
|
|
||
|
It defaults to 65536 bytes (the maximum), but it is possible that some
|
||
|
clients may perform better with a smaller transmit unit. Trying values
|
||
|
of less than 2048 is likely to cause severe problems.
|
||
|
|
||
|
In most cases the default is the best option.
|
||
|
|
||
|
|
||
|
LOCKING
|
||
|
-------
|
||
|
|
||
|
By default Samba does not implement strict locking on each read/write
|
||
|
call (although it did in previous versions). If you enable strict
|
||
|
locking (using "strict locking = yes") then you may find that you
|
||
|
suffer a severe performance hit on some systems.
|
||
|
|
||
|
The performance hit will probably be greater on NFS mounted
|
||
|
filesystems, but could be quite high even on local disks.
|
||
|
|
||
|
|
||
|
SHARE MODES
|
||
|
-----------
|
||
|
|
||
|
Some people find that opening files is very slow. This is often
|
||
|
because of the "share modes" code needed to fully implement the dos
|
||
|
share modes stuff. You can disable this code using "share modes =
|
||
|
no". This will gain you a lot in opening and closing files but will
|
||
|
mean that (in some cases) the system won't force a second user of a
|
||
|
file to open the file read-only if the first has it open
|
||
|
read-write. For many applications that do their own locking this
|
||
|
doesn't matter, but for some it may.
|
||
|
|
||
|
LOG LEVEL
|
||
|
---------
|
||
|
|
||
|
If you set the log level (also known as "debug level") higher than 2
|
||
|
then you may suffer a large drop in performance. This is because the
|
||
|
server flushes the log file after each operation, which can be very
|
||
|
expensive.
|
||
|
|
||
|
|
||
|
WIDE LINKS
|
||
|
----------
|
||
|
|
||
|
The "wide links" option is now enabled by default, but if you disable
|
||
|
it (for better security) then you may suffer a performance hit in
|
||
|
resolving filenames. The performance loss is lessened if you have
|
||
|
"getwd cache = yes", which is now the default.
|
||
|
|
||
|
|
||
|
READ RAW
|
||
|
--------
|
||
|
|
||
|
The "read raw" operation is designed to be an optimised, low-latency
|
||
|
file read operation. A server may choose to not support it,
|
||
|
however. and Samba makes support for "read raw" optional, with it
|
||
|
being enabled by default.
|
||
|
|
||
|
In some cases clients don't handle "read raw" very well and actually
|
||
|
get lower performance using it than they get using the conventional
|
||
|
read operations.
|
||
|
|
||
|
So you might like to try "read raw = no" and see what happens on your
|
||
|
network. It might lower, raise or not affect your performance. Only
|
||
|
testing can really tell.
|
||
|
|
||
|
|
||
|
WRITE RAW
|
||
|
---------
|
||
|
|
||
|
The "write raw" operation is designed to be an optimised, low-latency
|
||
|
file write operation. A server may choose to not support it,
|
||
|
however. and Samba makes support for "write raw" optional, with it
|
||
|
being enabled by default.
|
||
|
|
||
|
Some machines may find "write raw" slower than normal write, in which
|
||
|
case you may wish to change this option.
|
||
|
|
||
|
READ PREDICTION
|
||
|
---------------
|
||
|
|
||
|
Samba can do read prediction on some of the SMB commands. Read
|
||
|
prediction means that Samba reads some extra data on the last file it
|
||
|
read while waiting for the next SMB command to arrive. It can then
|
||
|
respond more quickly when the next read request arrives.
|
||
|
|
||
|
This is disabled by default. You can enable it by using "read
|
||
|
prediction = yes".
|
||
|
|
||
|
Note that read prediction is only used on files that were opened read
|
||
|
only.
|
||
|
|
||
|
Read prediction should particularly help for those silly clients (such
|
||
|
as "Write" under NT) which do lots of very small reads on a file.
|
||
|
|
||
|
Samba will not read ahead more data than the amount specified in the
|
||
|
"read size" option. It always reads ahead on 1k block boundaries.
|
||
|
|
||
|
|
||
|
MEMORY MAPPING
|
||
|
--------------
|
||
|
|
||
|
Samba supports reading files via memory mapping them. One some
|
||
|
machines this can give a large boost to performance, on others it
|
||
|
makes not difference at all, and on some it may reduce performance.
|
||
|
|
||
|
To enable you you have to recompile Samba with the -DUSE_MMAP=1 option
|
||
|
on the FLAGS line of the Makefile.
|
||
|
|
||
|
Note that memory mapping is only used on files opened read only, and
|
||
|
is not used by the "read raw" operation. Thus you may find memory
|
||
|
mapping is more effective if you disable "read raw" using "read raw =
|
||
|
no".
|
||
|
|
||
|
|
||
|
SLOW CLIENTS
|
||
|
------------
|
||
|
|
||
|
One person has reported that setting the protocol to COREPLUS rather
|
||
|
than LANMAN2 gave a dramatic speed improvement (from 10k/s to 150k/s).
|
||
|
|
||
|
I suspect that his PC's (386sx16 based) were asking for more data than
|
||
|
they could chew. I suspect a similar speed could be had by setting
|
||
|
"read raw = no" and "max xmit = 2048", instead of changing the
|
||
|
protocol. Lowering the "read size" might also help.
|
||
|
|
||
|
|
||
|
SLOW LOGINS
|
||
|
-----------
|
||
|
|
||
|
Slow logins are almost always due to the password checking time. Using
|
||
|
the lowest practical "password level" will improve things a lot. You
|
||
|
could also enable the "UFC crypt" option in the Makefile.
|
||
|
|
||
|
CLIENT TUNING
|
||
|
-------------
|
||
|
|
||
|
Often a speed problem can be traced to the client. The client (for
|
||
|
example Windows for Workgroups) can often be tuned for better TCP
|
||
|
performance.
|
||
|
|
||
|
See your client docs for details. In particular, I have heard rumours
|
||
|
that the WfWg options TCPWINDOWSIZE and TCPSEGMENTSIZE can have a
|
||
|
large impact on performance.
|
||
|
|
||
|
Also note that some people have found that setting DefaultRcvWindow in
|
||
|
the [MSTCP] section of the SYSTEM.INI file under WfWg to 3072 gives a
|
||
|
big improvement. I don't know why.
|
||
|
|
||
|
My own experience wth DefaultRcvWindow is that I get much better
|
||
|
performance with a large value (16384 or larger). Other people have
|
||
|
reported that anything over 3072 slows things down enourmously. One
|
||
|
person even reported a speed drop of a factor of 30 when he went from
|
||
|
3072 to 8192. I don't know why.
|
||
|
|
||
|
It probably depends a lot on your hardware, and the type of unix box
|
||
|
you have at the other end of the link.
|
||
|
|
||
|
MY RESULTS
|
||
|
----------
|
||
|
|
||
|
Some people want to see real numbers in a document like this, so here
|
||
|
they are. I have a 486sx33 client running WfWg 3.11 with the 3.11b
|
||
|
tcp/ip stack. It has a slow IDE drive and 20Mb of ram. It has a SMC
|
||
|
Elite-16 ISA bus ethernet card. The only WfWg tuning I've done is to
|
||
|
set DefaultRcvWindow in the [MSTCP] section of system.ini to 16384. My
|
||
|
server is a 486dx3-66 running Linux. It also has 20Mb of ram and a SMC
|
||
|
Elite-16 card. You can see my server config in the examples/tridge/
|
||
|
subdirectory of the distribution.
|
||
|
|
||
|
I get 490k/s on reading a 8Mb file with copy.
|
||
|
I get 441k/s writing the same file to the samba server.
|
||
|
|
||
|
Of course, there's a lot more to benchmarks than 2 raw throughput
|
||
|
figures, but it gives you a ballpark figure.
|
||
|
|
||
|
I've also tested Win95 and WinNT, and found WinNT gave me the best
|
||
|
speed as a samba client. The fastest client of all (for me) is
|
||
|
smbclient running on another linux box. Maybe I'll add those results
|
||
|
here someday ...
|
||
|
|
||
|
|
||
|
COMMENTS
|
||
|
--------
|
||
|
|
||
|
If you've read this far then please give me some feedback! Which of
|
||
|
the above suggestions worked for you?
|
||
|
|
||
|
Mail the samba mailing list or samba-bugs@anu.edu.au
|