我一直在尝试在我的应用程序中使用基本的异步HTTP调用.
我尝试在我的应用程序中使用Rails 3异步堆栈演示中的一些代码:http://github.com/igrigorik/async-rails,但我得到"不能从根光纤中产生"而且我没有想从哪里开始.这是我追踪的最高点:
(eval):10:in `yield'
(eval):10:in `get'
app/controllers/home_controller.rb:62:in `index'
/Users/ct/.rvm/gems/ruby-1.9.2-rc2@og/gems/actionpack-3.0.0.beta4/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
/Users/ct/.rvm/gems/ruby-1.9.2-rc2@og/gems/actionpack-3.0.0.beta4/lib/abstract_controller/base.rb:145:in `process_action'
Run Code Online (Sandbox Code Playgroud)
我的索引控制器方法很简单:
def index
http = EM::HttpRequest.new("http://www.google.com/").get
render :text => http.response
end
Run Code Online (Sandbox Code Playgroud)
我有所有正确的宝石,我有1.9.2-rc2,rails 3 beta 4,而且我很瘦.我也得到了async-rails应用程序本身使用相同的rvm和gemset运行良好.eventmachine reactor肯定在我的应用程序中运行.我喜欢任何有关如何使其正常工作的提示!
因此,我们在具有16GB RAM的计算机上拥有32GB的生产数据库。多亏了缓存,这通常根本不是问题。但是,每当我启动数据库的pg_dump时,来自应用服务器的查询就会开始排队,几分钟后,队列就消失了,我们的应用陷入停顿。
我将第一个承认我们存在查询性能问题,并且正在解决这些问题。同时,我希望能够每晚运行pg_dump,这种方式可以从数据库中吸取信息,并且不会降低应用程序的性能。我不在乎是否要花几个小时。我们的应用程序未运行任何DDL,因此我不必担心锁争用。
为了解决这个问题,我正在使用niceice和ionice来运行pg_dump。不幸的是,这不能解决问题。
nice ionice -c2 -n7 pg_dump -Fc production_db -f production_db.sql
Run Code Online (Sandbox Code Playgroud)
即使有了ionice,我仍然看到上面的问题。似乎I / O等待,并且大量搜寻导致了该问题。
vmstat 1
Run Code Online (Sandbox Code Playgroud)
向我显示iowait徘徊在20-25%左右,有时会飙升至40%。实际CPU%的波动范围是2%-5%,有时会飙升至70%。
我认为锁不是罪魁祸首。当我运行此查询时:
select pg_class.relname,pg_locks.* from pg_class,pg_locks where pg_class.relfilenode=pg_locks.relation;
Run Code Online (Sandbox Code Playgroud)
我只看到标记为已授予='t'的锁。我们通常不会在生产中运行任何DDL,因此锁似乎不是问题。
这是启用了WCHAN列的ps的输出:
PID WIDE S TTY TIME COMMAND
3901 sync_page D ? 00:00:50 postgres: [local] COPY
3916 - S ? 00:00:01 postgres: SELECT
3918 sync_page D ? 00:00:07 postgres: INSERT
3919 semtimedop S ? 00:00:04 postgres: SELECT
3922 - S ? 00:00:01 postgres: SELECT
3923 - S ? 00:00:01 postgres: SELECT
3924 - S …
Run Code Online (Sandbox Code Playgroud)