gpt4 book ai didi

ruby - 在 Ruby 中使用线程进行指标收集的开销很大吗?

转载 作者:太空宇宙 更新时间:2023-11-03 18:17:14 25 4
gpt4 key购买 nike

我有一个收集和分析使用指标的服务器。我希望我的架构的各个部分通过 REST API 定期向服务器发送指标。

我不想在传输指标时阻止执行,因此我考虑过创建一个将分拆线程的方法:

require 'net/http'

module Metrics
def self.time(time_to_process)
Thread.new do
uri = URI.parse(url)
http = Net::HTTP.new(uri.host, uri.port)
# ...do a bunch of setup...
response = http.request(request)
end
end
end

...以及应用程序内部。

def app_method
# ...do stuff, measure time
Metrics.time(time_to_process)
end

由于应用程序代码是单线程的,app_method 需要一两秒的时间来执行,我预计在任何时候都不会有超过 10-100 个指标收集线程在运行,所以操作系统线程限制不是很大关注。

但是我想知道在内存和 CPU 时间方面的开销是多少来分拆新线程(不计算实际执行 Net::HTTP 调用所需的内存/CPU)?这种方法有明显的缺点吗?

最佳答案

简短的回答是肯定的——临时启动一个新的线程会产生非常大的内存和 CPU 开销!

避免在您想执行后台作业时创建新线程的行业标准是使用 thread pools ,它们只是预先创建的一些线程,等待接收消息,并相应地执行工作。

查看类似的解决方案(如 newrelic 的),大多数使用后台进程(或代理)负责实际将信息发送到服务器,而应用程序发送轻量级发送给代理的消息,代理在方便时聚合并批量发送。

在 Rails 系统中,不建议从头开始构建后台作业,您应该考虑使用像 sidekiq 这样的 gem 及其建议的架构来为您完成这项工作。其中大多数也不依赖于主应用程序中的线程,而是依赖于它们自己的进程(有时在它们自己的机器上),通过队列上的消息与应用程序通信(使用像 Redis 这样的存储库例如)。

关于ruby - 在 Ruby 中使用线程进行指标收集的开销很大吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24212309/

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