It looks like it's clear video conversion is your bottleneck. I would also suggest doing that on a different worker process.
You will also want to avoid converting the same file again if you've done it before... I was suggesting to give a shot of using ONLY nginx with Django. If you search in Google you'll find docs that help you setting that up. In general, 1GB of RAM is not much for a site that coverts video on the fly... Regards On 1/10/09, Graham Dumpleton <graham.dumple...@gmail.com> wrote: > > > > On Jan 10, 11:05 am, lenin <lenin....@gmail.com> wrote: >> The server MPM is prefork. >> >> I had mod_wsgi in daemon mode I think, with this lines: >> >> WSGIDaemonProcess user_name user=user_name group=user_name >> WSGIProcessGroup user_name >> WSGIScriptAlias / /path/to/django.wsgi > > Which is one process with 15 threads. That means at most 15 requests > can be handled at the same time. > > The problem is that with what you are doing, is it is likely that the > requests take a long time if they doing video conversion. Thus if you > get 15 requests active at one time, other requests will be queued and > will appear to take a lot longer. > > How long does a request which involves conversion normally take? > Knowing this is critical to determining how many processes/threads you > need to handle enough concurrent requests based on your load. > > The next problem though is if you are doing the video conversion > within the Django process itself, then allowing more concurrent > requests and thus conversions, means that the process size will > balloon out if this process takes a lot of memory for each request. > So, are you doing conversion within the Django process and how much > memory does the process of conversion use. > > You thus perhaps should not be doing video conversion within the same > process, but executing a separate application to perform the > conversion. Even then, you may need a queueing system or otherwise > some way of restricting how many conversions can occur at a time, > because even though performed by a separate application, it may still > take up a lot of transient memory while running. > > Also, from what I understand Django's abilities to serve up static > files or streamed data, isn't that excellent. In particular, if > hosting with WSGI capable server, it doesn't use the wsgi.file_wrapper > extension. This extension ensures that files are streamed in blocks > and the file is not read all into memory first in order to be able to > send it. Also, if operating system provides it, Apache will use > sendfile() or memory mapping techniques to return data in a much more > efficient way. So, how exactly are you returning the converted data > for Django to respond with? > >> That was at the moment of the first message, but now I have commented >> out the WSGIDaemonProcess and WSGIProcessGroup directives, and what >> happens is that the memory fills up until the server crashes, It runs >> out of RAM and swap and it just dies. But until it crashes it is very >> responsive. > > Which is not surprising as prefork means that instead of a restricted > number of copies of Apache, based on your configuration you could have > up to 70. That is 70 copies of Django, plus memory from conversions. > This would quickly cripple a box without adequate memory. Just the > startup cost of the extra processes when Apache deems they need to be > created would cause the load average of the box to shoot up. > >> I have tried putting processes=5 threads=1 maximum- >> requests=200 in the daemon configuration but it doesn't help. > > Which is only 5 concurrent requests, which is worse than the 15 you > had before. You also have 5 potentially fat Django processes rather > than 1. > > Graham > >> On apache I have this configuration >> KeepAlive Off >> <IfModule mpm_prefork_module> >> StartServers 5 >> MinSpareServers 5 >> MaxSpareServers 10 >> MaxClients 70 >> MaxRequestsPerChild 150 >> </IfModule> >> >> On nginx I have >> worker_processes 10; >> events { >> worker_connections 4096; >> use epoll;} >> >> location / { >> proxy_pass http://localhost:8080; >> proxy_redirect default; >> proxy_set_header Host $host; >> proxy_set_header X-Real-IP $remote_addr; >> proxy_set_header X-Forwarded-For >> $proxy_add_x_forwarded_for; >> >> client_max_body_size 10m; >> client_body_buffer_size 128k; >> >> proxy_connect_timeout 1000; >> proxy_send_timeout 1000; >> proxy_read_timeout 1000; >> >> proxy_buffer_size 4k; >> proxy_buffers 4 32k; >> proxy_busy_buffers_size 64k; >> proxy_temp_file_write_size 128k; >> } >> I only include the bits I think are relevant. >> >> The site is kickyoutube.com, you can download any youtube video in >> several formats by appending kick to the youtube video url. Although >> at this moment I have disabled the formats that need conversion. >> >> I'm using mysql for the database and it is on the same server, but it >> really doesn't do a lot of queries. >> >> I have memcached but I only cache the list of latest videos at the >> homepage. >> >> So it really is the video conversion what takes up all the memory, >> because when I disable it everything seems normal. >> >> On 9 ene, 15:06, Graham Dumpleton <graham.dumple...@gmail.com> wrote: >> >> > On Jan 10, 4:21 am, lenin <lenin....@gmail.com> wrote: >> >> > > Hello, >> >> > > I would like to know if you could help me solve an issue with my >> > > server setup. I have a Django application running with mod_wsgi on >> > > apache with nginx as frontend, and it got very popular so the server >> > > gets more than 10000 requests a day. The app does some video >> > > conversion with ffmpeg and mencoder, using the commands module to call >> > > the commands. >> >> > > The server has 1 GB of RAM and an Intel Xeon 3060 processor. >> >> > > At first the server would crash and I needed to reboot it, and the >> > > problem seemed to be that the system ran out of swap, so I thought it >> > > was a memory issue, did some modifications and now memory usage is >> > > stable. >> >> > > But now the problem is that the site takes too much to load some >> > > times, I think because of all the simultaneous requests. I was >> > > wondering what would be the optimal apache+mod_wsgi+nginx >> > > configuration for a setup like this. >> >> > > Any help will be very much appreciated. >> >> > What MPM is Apache running with, prefork or worker MPM? Run 'httpd -V' >> > if you don't know. >> >> > What is the mod_wsgi configuration you are using for setting up your >> > Django instance? Are you using embedded mode or daemon mode? Post >> > actual WSGI configuration bits, do not describe it. >> >> > BTW, 10000 requests a day is not much. ;-) >> >> > Graham > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---