在我的一个rails应用程序中,当我粘贴文本,键入和(特别是)删除文本时,控制台开始运行得非常慢。我可以在顶部看到irb正在使用大量的cpu。但我不知道如何进一步诊断这个问题。它刚刚开始发生在几个星期前。我想知道它是否可能与readline / wirble相关?我使用这两个。
我只是在另一个应用程序中尝试过,粘贴在一个文本块中,看起来同样糟糕 - 文本以每秒一个字符的速率出现!也许我的命令行历史已经填满了什么?我怎么能删除它? (对于rails控制台,而不是我的bash命令行历史记录)
感谢任何建议 - 最多
编辑 - 抱歉,应该提供一些系统详细信息。你走了:
System - Ubuntu 10.04
Ruby version - ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]
我刚尝试了普通的irb,我遇到了同样的问题。它甚至可能更慢,在我粘贴的文本块中途停止测试它的时间非常接近。
我重启了很多次(我的笔记本电脑电池已经无法启动,所以无论如何我每次都要重新启动它。)
我不在vm。
我最近开始使用RVM(ruby版本管理器),它似乎与此同时发生,尽管它可能只是巧合。有问题的控制台正在使用系统红宝石发生,但不是rvm。
以下是ps aux | grep irb
的输出:
max 12583 0.0 0.0 1756 484 pts/7 S+ Apr11 0:00 sh -c irb -r irb/completion -r "/home/max/work/rails_apps/millionaire_container/millionaire/config/environment" -r console_app -r console_with_helpers --simple-prompt
max 12584 15.9 2.7 61872 56956 pts/7 S+ Apr11 158:26 irb
max 13981 64.4 0.9 20080 18708 pts/9 R+ 09:40 29:51 irb
max 14625 21.8 0.6 15020 12628 pts/12 Rl+ 10:25 0:20 irb
max 14757 0.0 0.0 3048 804 pts/13 R+ 10:27 0:00 grep --color=auto irb
答案 0 :(得分:17)
似乎rvm的readline导致缓慢,把这一行放在〜/ .irbrc中:
IRB.conf[:USE_READLINE] = false
现在尝试在irb上粘贴一些东西。它快吗?好!
现在唯一的问题是你已经失去了编辑线条的能力。我们需要修复rvm的readline。
# assuming 1.8.6 is your rvm's default ruby version
rvm package install readline
rvm remove 1.8.6
rvm install 1.8.6 --with-readline-dir=$rvm_path/usr
不要忘记编辑irbrc中的IRB.conf行。
答案 1 :(得分:4)
简单地使用readline对我没有帮助; libreadline似乎存在更深层次的问题,至少在OSX 10.7上,select()系统调用在返回之前等待超时到期,即使有可用的数据。
解决这个烦恼的我的黑客是:
cd $rvm_path/src/readline-6.2
vi config.h
(change the line "#define HAVE_SELECT" -> #undef HAVE_SELECT)
make install
答案 2 :(得分:3)
我在Ubuntu 12.04上使用REE遇到了同样的问题,并尝试了此处列出的所有解决方案,但没有成功。对我来说,最终的解决方案是:
该问题似乎与libreadline6-dev的次要不兼容。当libreadline6-dev存在于机器上时,它将在编译Ruby时使用,并且会出现问题。无论编译ruby时传递的--with-readline-dir选项如何,都会发生这种情况。不幸的是,在最新版本的Ubuntu中,没有libreadline5-dev,但是有libreadline-gplv2-dev。
答案 3 :(得分:0)
FWIW @ fl00r建议的修复确实有效。对我来说,这种新行为似乎与安装Snow Leopard 10.6.7更新有关。它发生在IRB和Rails控制台中。
对我来说似乎有用的另一件事是确保粘贴测试的最后一行包含“裸”换行符。
这绝对是新行为,非常烦人。
答案 4 :(得分:0)
我也在OS X上看到它。 @ fl00r的修复工作(在粘贴试图粘贴任何键时,嗯,粘贴。)@ jesvs修复工作并且是永久性的。