gzip causing high cpu load for streaming traffic
Maxim Dounin
mdounin at mdounin.ru
Sat Jan 8 05:33:31 MSK 2011
Hello!
On Fri, Jan 07, 2011 at 08:39:52PM -0500, steveh wrote:
> Ok this is weird I noticed tonight high CPU load on two out of three of
> our stream servers, which are serving mp4 and flv via the pseudo
> streaming modules.
>
> After investigating the differences between the two high CPU boxes and
> the one low CPU machine the only notable difference was that on the two
> high CPU boxes the config was including our standard gzip options:-
> [code]
> gzip on;
> gzip_static on;
> gzip_http_version 1.1;
> gzip_vary on;
> gzip_comp_level 6;
> gzip_proxied any;
> gzip_types text/plain text/css application/json application/x-javascript
> text/xml application/xml application/xml+rss text/javascript;
> # make sure gzip does not lose large gzipped js or css files
> gzip_buffers 16 8k;
>
> # Disable gzip for certain browsers.
> gzip_disable "MSIE [1-6].(?!.*SV1)";
> [/code]
>
> Now as you can see the types is set to text based types so .mp4 and .flv
> files really shouldn't be touched, so I looked else where. After much
> looking I really couldn't find any significant differences so I added
> the include of the above to the low CPU machine. Sure enough the CPU
> instantly jumped up with each nginx process using 20-40% cpu instead of
> 0-2% it was before the reload.
>
> Still not convinced and after double checking the gzip config to confirm
> it really shouldn't be going anywhere near the streaming content I added
> gzip off and gzip_static off to the *.mp4 and *.flv locations in the
> config on the high CPU machine and reloaded. An hour or two later ( time
> for the existing users streams to finish ) and the CPU load has already
> dropped to the very low values I expect from nginx for the connection
> load on the machine e.g. 0 - 2% per nginx process instead of the 40-90%
> I was seeing.
>
> Just to confirm I checked the network load and connected users and sure
> enough the actual connections and bandwidth is still the same so the
> machine is still under the same amount of connection load as before just
> with significantly lower CPU.
>
> So what's going on? Have I missed something totally obvious? Or is there
> a nasty bug which means when gzip is enabled in this manner it causes
> significant processing overhead for items its not even meant to be
> processing?
Working with "gzip_static on;" implies extra open() syscall per
request (it work's based on .gz file presense, not gzip_types) and
isn't recommended unless actually used.
It shouldn't make any difference with flv handler activated though
(flv disables general content handlers and gzip_static in
particular). Most likely the same applies to mp4.
Working with "gzip on;" implies extra check for content-type per
request (and some minimal checks during response sending). This
shouldn't cause much load.
> In case its relavent our main http block includes:
> [code]
> include mime.types;
> default_type application/octet-stream;
> [/code]
>
> The current streaming bocks, which include the workaround (turning gzip
> off) are:-
>
> [code]
> # Actual Streaming
> location ~ /streaming/(.*\.mp4)$ {
> # Fix strange CPU usage caused by gzip
> gzip off;
> gzip_static off;
>
> limit_rate_after 10m;
> limit_rate 400k;
> alias /streaming/$1;
> internal;
> mp4;
> }
>
> location ~ /streaming/(.*\.flv)$ {
> # Fix strange CPU usage caused by gzip
> gzip off;
> gzip_static off;
>
> limit_rate_after 10m;
> limit_rate 400k;
> alias /streaming/$1;
> internal;
> flv;
> }
Could you please check if it's gzip or gzip_static which causes
high cpu usage?
Also, could you please provide some more details about nginx
you're using? I.e. nginx -V output, please.
Maxim Dounin
More information about the nginx
mailing list