[Backgroundrb-devel] worker process hanging around, spiking memory
hemant
gethemant at gmail.com
Wed Feb 27 21:09:38 EST 2008
On Thu, Feb 28, 2008 at 5:54 AM, Clint Troxel <clint at ctro.net> wrote:
> Greg,
>
> that is helpful. thanks!
>
> calling exit() from the workers does indeed kill the process.
>
> Two more questions:
>
> 1) before the process is killed by exit() I repeatedly see the memory
> of the bdrb process spike from 18 to 45 M -- is there an explanation
> for this? Also, the process seems to take a long time to finish --
> minutes just to send 4 emails. Could some sort of configuration be
> causing behavior like this?
I do not think so. But in each process full rails environment is
loaded and hence its costly.
Thats why, you should probably just use thread_pools rather than
starting new processes.
>
> 2) More importantly, what is the recommended version to run? And, how
> do I check the version in my vendor dir? (I can't remember what
> version you were at when I imported into my rails proj)
>
Recommended version to run is one from git mainline repo:
http://gitorious.org/projects/backgroundrb/repos/mainline
We are getting ready for release 1.0.3 and I have put together new
documentation at:
http://backgroundrb.gnufied.org
Please note that above location is just temporary and in a day or two
when 1.0.3 comes out, main documentation at rubyforge will reflect the
same doco.
>
>
> On 2/27/08, Greg Campbell <gtcampbell at gmail.com> wrote:
> > Hi Clint,
> >
> >
> > On Wed, Feb 27, 2008 at 3:26 PM, Clint Troxel <clint at ctro.net> wrote:
> > > Hi. Posted a general question earlier today. I have a specific
> > > question this time -- hoping someone can help out. I think I'm
> > > probably doing something incorrectly. Here goes:
> > >
> > > I have a Worker method that sends a lot of emails. The method looks like
> > this:
> > >
> > >
> > > def send_participant_reminders(args=nil)
> > > args[:emails].each do |email|
> > >
> > > unless email.notified?
> > > Emailer.deliver_survey_reminder(email)
> > > end
> > >
> > > end
> > > end
> > >
> > >
> > > I call that worker from a controller like so:
> > >
> > > MiddleMan.new_worker(:worker => :participant_worker)
> > > MiddleMan.ask_work(:worker => :participant_worker,
> > > :worker_method => :send_participant_reminders,
> > > :data => {:emails => @emails})
> > >
> > > ----------------------------
> > >
> > > My emails are being sent, but I'm seeing a new process created *each
> > > time I invoke the code in the controller*. That process starts out at
> > > about 17m of memory then, once all work appears to have been
> > > completed, jumps to about 50m. The process stays around until
> > > "script/backgroundrb stop".
> > >
> > > Maybe I've been reading the examples incorrectly?
> > >
> > > Any help would be appreciated. Seeing this same problem (I think)
> > > suck up 4G of ram on a production server. yuck.
> > >
> > > Thanks again,
> > > clint
> >
> > Calling new_worker does indeed create a new backgroundrb process (which may
> > or may not be necessary in your case, see below). If you do in fact need to
> > create a new process for each task, you'll need to call either exit (from
> > within the worker) or MiddleMan.delete_worker (from the controller) once the
> > task is done. If you need to keep track of these worker tasks while they're
> > running (to call delete_worker from the controller, or to use ask_status),
> > you should also use a job_key when you create it.
> >
> > You may not actually need the new process, however. If the likely use case
> > is that there will only be one of these tasks running at a time, then you
> > can just omit the new_worker call entirely and direct all calls to a single
> > running instance of the worker process. You may also want to investigate
> > using thread_pool.defer inside the worker to run the individual tasks in
> > threads (rather than spawning new worker processes for each one) if it seems
> > likely that there will be multiple requests running simultaneously.
> >
> > Thanks,
> > Greg
> > p.s. If I've misrepresented anything, I'd like to invite Hemant or anyone
> > else more knowledgeable than I am to correct me, as I've only started
> > working on backgroundrb in the last few weeks.
> >
You have been absolutely correct!
More information about the Backgroundrb-devel
mailing list