为什么GC统计信息minor_gc_count减少?

时间:2019-12-05 15:54:24

标签: ruby-on-rails heroku garbage-collection

我们有一个heroku应用。当我早上检查GC.stat时,GC.stat[:minor_gc_count]是51。当天晚些时候是50。

根据我的理解,这应该是垃圾收集器进行次扫描的次数,因此第二天早上去是有道理的,但是为什么会减少呢?

510 talos-intelligence :>heroku run rails c --remote production
Running rails c on ⬢ talosintelligence... up, run.2287 (Standard-1X)
Loading production environment (Rails 5.2.2.1)
irb(main):001:0> GC.stat
=> {:count=>63, :heap_allocated_pages=>1753, :heap_sorted_length=>1753, :heap_allocatable_pages=>0, :heap_available_slots=>714528, :heap_live_slots=>713742, :heap_free_slots=>786, :heap_final_slots=>0, :heap_marked_slots=>471239, :heap_eden_pages=>1753, :heap_tomb_pages=>0, :total_allocated_pages=>1753, :total_freed_pages=>0, :total_allocated_objects=>2802530, :total_freed_objects=>2088788, :malloc_increase_bytes=>65256, :malloc_increase_bytes_limit=>32225676, :minor_gc_count=>51, :major_gc_count=>12, :remembered_wb_unprotected_objects=>4626, :remembered_wb_unprotected_objects_limit=>8538, :old_objects=>458044, :old_objects_limit=>838856, :oldmalloc_increase_bytes=>65712, :oldmalloc_increase_bytes_limit=>19737900}
irb(main):002:0> exit
**Airbrake: closed
511 talos-intelligence :>heroku run rails c --remote production
Running rails c on ⬢ talosintelligence... up, run.7226 (Standard-1X)
Loading production environment (Rails 5.2.2.1)
irb(main):001:0> GC.stat
=> {:count=>62, :heap_allocated_pages=>1618, :heap_sorted_length=>1913, :heap_allocatable_pages=>295, :heap_available_slots=>659511, :heap_live_slots=>659395, :heap_free_slots=>116, :heap_final_slots=>0, :heap_marked_slots=>467961, :heap_eden_pages=>1618, :heap_tomb_pages=>0, :total_allocated_pages=>1618, :total_freed_pages=>0, :total_allocated_objects=>2726093, :total_freed_objects=>2066698, :malloc_increase_bytes=>5662240, :malloc_increase_bytes_limit=>24780563, :minor_gc_count=>50, :major_gc_count=>12, :remembered_wb_unprotected_objects=>4632, :remembered_wb_unprotected_objects_limit=>9262, :old_objects=>456572, :old_objects_limit=>913146, :oldmalloc_increase_bytes=>7549584, :oldmalloc_increase_bytes_limit=>19737900}

1 个答案:

答案 0 :(得分:1)

问题可能在测试本身中。当您运行GC.stat时,它将返回有关您的当前正在运行的进程的信息。没关系问题是每次您运行

heroku run rails c --remote production

在您的控制台中,它不会连接到您当前在Heroku上运行应用程序的进程。它将为控制台启动新进程,并且您将为此新创建的进程(而不是您的应用程序响应Web请求的进程)返回GC.stat。这就是为什么它是如此之低,甚至可能降低的原因。

您实际上可以自己进行测试。当您连接到Heroku上的rails控制台时,请运行以下ruby代码:

Process.pid

它将返回当前进程的ID。然后断开与Heroku的连接,然后重新连接并再次运行Process.pid。您会看到它将返回不同的进程ID,因为当您从控制台断开连接并为新连接创建新进程时,它会停止上一个进程。

您还可以尝试在这些连接中运行GC.stat,您会发现它们可能有所不同,并且这些连接之间的计数可能会上下波动,这是因为进程不依赖于每个进程其他。

相关问题