mysql+init+内存泄漏_mysql – 内存泄漏,内存中有大量SQL Logging字符串

我的应用程序在Puma(2.4)集群模式下运行,有4名工作人员.

最初,它们总共使用不到2GB的RAM,但是在运行20小时后不断增长并最终占用7GB.

通过使用ObjectSpace,我发现字符串对象的数量增长得非常快,每个工作者的对象数量从〜300k到4-5百万.

然后我使用以下脚本将这些字符串分组前60个字符并执行计数:

counts = Hash.new(0)

ObjectSpace.each_object do |o|

next unless (o.class == String)

counts[o[0,60]] += 1

end

counts = counts.to_a.sort_by(&:last);

puts counts[-10..-1]

事实证明,这些字符串中的大多数都是来自Active Record的SQL Logging

ObjectSpace.count_objects

# result

{

:TOTAL => 2439593,

:FREE => 209200,

:T_OBJECT => 65944,

:T_CLASS => 11343,

:T_MODULE => 2003,

:T_FLOAT => 13,

:T_STRING => 1821445,

:T_REGEXP => 6570,

:T_ARRAY => 157012,

:T_HASH => 27477,

:T_STRUCT => 1406,

:T_BIGNUM => 1393,

:T_FILE => 142,

:T_DATA => 75081,

:T_MATCH => 1334,

:T_COMPLEX => 1,

:T_RATIONAL => 2809,

:T_NODE => 51890,

:T_ICLASS => 4530

}

# top 10 string

["PricingRule Exists: SELECT" , 74632]

[": SELECT COUNT(*) FROM `re" , 85454]

["CACHE: SELECT `companies`" , 93045]

["PricingRule Load: SELECT " , 114169]

["Page Load: SELECT `pages`" , 140245]

[": SELECT COUNT(*) FROM `pa" , 182274]

["Customer Load: SELECT `cu" , 191972]

["Company Load: SELECT `com" , 253025]

["Page Load: SELECT `pages`." , 320267]

["DestinationCountry Load: S" , 413299]

我使用Rails 4,Ruby 2,mysql2(v0.3.13)并在警告时设置日志级别,但这些SQL字符串仍然存储并继续增加内存.

有没有人对这个问题有任何想法或经验?如果你能提供帮助,我非常感谢.

谢谢!

最佳答案 这些字符串可以来自’sql.active_record’事件,原因可能是您订阅了

‘sql.active_record’事件并将这些字符串保存在您的对象中,以便GB无法释放它们.

ActiveSupport::Notifications.subscribed(callback, "sql.active_record") do

end

确保在使用后取消订阅.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值