Performance 尝试跟踪rails 2.3上mysql2的性能问题
我在使用ruby的Performance 尝试跟踪rails 2.3上mysql2的性能问题,performance,memory-leaks,ruby-1.9.2,ruby-on-rails-2,mysql2,Performance,Memory Leaks,Ruby 1.9.2,Ruby On Rails 2,Mysql2,我在使用ruby的mysql2适配器查询MySQL时遇到了一个奇怪的问题。我使用的是ruby-1.9.2-p290和mysql2-0.2.18.gem(因为mysql2>=0.3与Rails 2.3.14有问题,我必须这样做)。除了我在DB上执行的一个特定查询之外,它工作得很好-查询返回的结果很好,但是处理结果所花费的时间不合理(与从ruby 1.8升级之前使用的旧的ruby mysqlgem相比)。代码的要点如下所示: require 'mysql2' client = My
mysql2
适配器查询MySQL时遇到了一个奇怪的问题。我使用的是ruby-1.9.2-p290
和mysql2-0.2.18.gem
(因为mysql2>=0.3
与Rails 2.3.14有问题,我必须这样做)。除了我在DB上执行的一个特定查询之外,它工作得很好-查询返回的结果很好,但是处理结果所花费的时间不合理(与从ruby 1.8升级之前使用的旧的ruby mysql
gem相比)。代码的要点如下所示:
require 'mysql2'
client = Mysql2::Client.new({
:host => 'localhost',
:username => 'minda',
:password => 'sikriT',
:database => 'testdb'
})
# pretty elaborate query, utilizing
# several joines and returning about
# ~200,000 rows
sql = "SELECT * FROM ..."
# returns in reasonable time
results = client.query(sql, :cast => false)
# this takes about 3 minutes...
# before the switch to 1.9/mysql2, this took
# about 10 sec (which was reasonable,
# considering I did some fairly
# processing inside the block)
results.each do |row|
# do nothing here!
end
我已经把代码翻了个底朝天,eventuall注释掉了块中的所有内容,但看不出是什么导致了性能瓶颈
我应该注意到,在这个特定的程序中,我使用相同的连接执行了很多查询,而这是Suffucate的唯一位置——可能是由于结果集很大。我直接在DB服务器上运行了这个查询,没有发生什么特别的事情。我还注意到,只有在Rails的脚本/控制台上下文中运行这个程序时,或者从Rails应用程序内部调用它时,才会发生这种情况。当我在一个简单的IRB实例中运行上述代码时(没有rails开销),它运行得很好——这让我相信这可能是内存/GC问题
奇怪的是,
mysql2
(特别是,mysql2::Result
)会被大型查询阻塞(客户机使用QuadCore和8GB RAM运行)。如何解决这个问题有什么想法吗?谢谢。经过大量挖掘,发现这是由我在环境.rb中的编码设置引起的,我在那里:
Encoding.default_internal = 'UTF-8'
显然,Mysql2
正在重新编码结果集中的所有字符串,这显然消耗了大量资源(对于大型结果集)
注释这一行解决了这个问题。如果我正确地阅读了您的问题,那么它实际上并没有阻塞查询,而是在块内部。对吗?如果是这样的话,mysql就不是问题。这是正确的,我的意思是。但是,它在对Mysql2::Result
进行操作的块中显示了这种行为。所以我不知道如何更好地表达这一点。