Hi Jonathan, I thought that maybe using 'call_async' rather than simply 'call' might improve the situation but the behavior is the same with either call.
Thomas Allen On Wed, Nov 18, 2009 at 12:53 PM, Jonathan Rochkind <rochk...@jhu.edu> wrote: > Do the RpcTask task methods end up using ruby threads to do their work? > That call_async method definitely sounds suspiciously like it might. > > I've found that ruby threads under mongrel (although I don't think it's > neccesarily an issue specific to mongrel) sometimes block when you don't > think they ought to be, or end up in wait state for long periods when it > doesn't seem like they ought to be. > > When I have actual control over my ruby threads, I've found that explicitly > setting the thread priority of 'background' threads to be lower than 0 > generally frees things up. If RpcTask is creating threads and you don't > want to hack it's code to set thread priorities... is there a synchronous > method you can use instead of call_async to make your rpc? > > Jonathan > > Thomas Allen wrote: >> >> Hi Everyone, >> >> I'm running a Rails site on Mongrel and I can't figure out why a >> particular type of request ties up Mongrel easily. The requests that >> tie up Mongrel call an XML-RPC server like so: >> >> # In the controller >> def site_start >> if params[:id] >> �...@site = Site.find(params[:id]) >> �...@site.site_start >> render :json=>{:success=>true} >> end >> end >> >> # In the model >> def site_start >> RpcTask.manage(self, 'start') >> end >> >> # In RpcTask >> def manage(site, task) >> run('manage_task', { >> :site => site.name, >> :site_id => site.id, >> :task => task >> }) >> end >> >> # which calls >> def run(task, task_params = {}) >> begin >> server = XMLRPC::Client.new2('http://localhost:9192/') >> result = server.call_async(task,task_params) >> return result >> rescue XMLRPC::FaultException => err >> logger = ActiveRecord::Base.logger >> logger.error(err.faultCode) >> logger.error(err.faultString) >> logger.error(result) >> end >> false >> end >> >> If I call the model method directly from the console, the RPC side >> responds very quickly: >> >> >>>> >>>> start = Time.now; Site.first.site_start; (Time.now - start).to_s >>>> >> >> => "0.493253" >> >> Removing the body of RpcTask.run results in comparable performance. >> Also, by switching from a single mongrel to a four-mongrel cluster, I >> was able to get the these actions to perform acceptably but I imagine >> that I'm doing something very wrong here to require so much power. Any >> ideas? >> >> Thanks, >> Thomas Allen >> _______________________________________________ >> Mongrel-users mailing list >> Mongrel-users@rubyforge.org >> http://rubyforge.org/mailman/listinfo/mongrel-users >> >> > > _______________________________________________ > Mongrel-users mailing list > Mongrel-users@rubyforge.org > http://rubyforge.org/mailman/listinfo/mongrel-users > _______________________________________________ Mongrel-users mailing list Mongrel-users@rubyforge.org http://rubyforge.org/mailman/listinfo/mongrel-users