Some times ago, I have a need to host some big files for open download. At first, I think Nginx will perform pretty well without muck configuration. In reality, there are complaints about slow and interrupted downloads which is quite annoying.
I ended up using Xender for PC to transfer the files, but after digging the Nginx docs, I did find some nice changes that can fix these problems and produce a high throughput. Here’s my tweaks made to the nginx.conf file:
- Turn off
sendfile
The Linuxsendfile
call is known to have throughput degradation when in high load. Disabling it helps to keep a higher throughput at high load. Also, when serving large files withsendfile
, there are no ways to control readahead. - Enable TCP nopushTCP nopush fills the TCP packet to its maximum size before sending. This can help increase throughput if you’re serving large files.
- Use Nginx’s
directio
to load fileUsingdirectio
can help improving performance by skipping a bunch of steps happened in the kernel when reading files, thus speed up the throughput. - Enable the use of
libaio
for optimal performancelibaio
allows asynchronous I/O to be done in kernel, which results in faster read and write speed. However, it needslibaio
to be installed and re-compiling your Nginx in order to have it supported. I used the following flow to recompiling Nginx with aio support.# Install libaio on RHEL/CentOS yum install libaio libaio-devel -y wget http://nginx.org/download/nginx-1.9.4.zip unzip -q nginx-1.9.4.zip cd nginx-1.9.4 # Configure Nginx according to your needs, but it should also include # --with-file-aio in order to use libaio ./comnfigure --with-file-aio make
The complete nginx.conf should look like this:
http { ... sendfile off; tcp_nopush on; aio on; directio 512; # required if you're using Linux and uses aio ... }
There are also some lower-level tewaks like mounting your disks with noatime flags and use ext4/xfs when serving files.