gpt4 book ai didi

ruby-on-rails - Ruby:什么会导致同一代码块的执行在一遍又一遍地运行时随着时间的推移而变慢?

转载 作者:太空宇宙 更新时间:2023-11-03 16:30:08 24 4
gpt4 key购买 nike

我的 rails 项目中有一个后台 worker ,它在 ruby​​ 内存中执行大量复杂的数据聚合。我看到一个奇怪的行为。当我启动一个执行作业(数千个)的进程时,我发现性能随着时间的推移出现了奇怪的下降。一开始,一个作业完成大约需要 300 毫秒,但在处理了大约 10.000 个作业后,执行时间将逐渐减少到 2000 毫秒左右。这对我来说是个大问题,我对这怎么可能发生感到困惑。我没有看到内存泄漏(RAM 使用情况非常稳定),也没有看到任何错误。是什么导致了低级别的这种情况,我应该从哪里开始寻找?

背景事实:

  • 在该作业所做的事情中,它对大量字符串进行大量正则表达式比较。除了对 redis 实例的读/写操作外,没有进行外部数据库调用。
  • 我曾尝试在不同的服务器/计算机上执行相同的操作,但症状都是一样的。
  • 如果我在开始表现太差时重新启动进程,性能会立即恢复良好。
    • 我正在为作业处理器运行 ruby​​ 1.9.3p194 和 rails 3.2 以及 sidekiq 2.9.0

最佳答案

很难从您的服务的有限描述中分辨出来,但该行为与一个小的(即没有泄漏的)数据缓存一致,该缓存要么查找性能差,要么您非常依赖,并且正以适度的速度增长。一个人为的例子可能是“该工作人员到目前为止完成的工作”的列表,它在代码中的几个点按需排序。

其中一个缓存是您无法直接控制的:Ruby 的符号表。查找符号类似于系统中符号数量的 O(log(n)),这很好。但是,如果您处理大量符号,并且您的 worker 的每次迭代都可以生成新符号(例如,如果输入哈希中的键可以是任意数据,并且您使用 symbolize_keys方法或在很多不同的字符串上调用 to_sym)。符号永久缓存在 Ruby 进程中。理论上,几百万不会显示为内存泄漏。但是,如果您的代码可以从 10,000 个符号增加到 1,000,000 个符号,那么所有符号生成和检查代码都会减慢一个小的固定量。如果您经常这样做,它可能会解释几百毫秒。

如果搜索可疑代码让您一无所获,那么找到问题的最佳方法是使用分析器。您应该收集表现良好和表现不佳的代码的概况,然后比较两者。

关于ruby-on-rails - Ruby:什么会导致同一代码块的执行在一遍又一遍地运行时随着时间的推移而变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17613686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com