扭矩箱服务:漂亮吗?
Posted
技术标签:
【中文标题】扭矩箱服务:漂亮吗?【英文标题】:Torquebox services: niceness? 【发布时间】:2013-09-13 12:30:11 【问题描述】:我正在考虑转移到 Torquebox,但我需要将我想要更改为服务的外部守护程序之一的 nice 级别设置为 19。在 Torquebox 中是否有任何等效的方法可以做到这一点,以便服务的运行时优先级比其他任何东西都低,尤其是 Torquebox 的“web”部分?
【问题讨论】:
【参考方案1】:服务只是符合 API TorqueBox 的 PORO 可以使用。 TorqueBox 期望您在调用Service#start
后尽快让他的线程返回,这就是为什么服务通常在单独的工作线程中运行,您可以使用Thread#priority
设置工作线程的优先级(请参阅https://github.com/jruby/jruby/wiki/DifferencesBetweenMriAndJruby#thread-priority) - 这Thread
相当于 nice
应该很简单:
class Service
def start
@worker = Thread.new do
# do servicy stuff
end
@worker.priority = ...
end
def stop
@worker.stop
end
end
然而,Java 似乎在这方面遇到了一些依赖于操作系统的怪癖(请参阅Setting priority to Java's threads 和 Throttling CPU from within Java),而 JRuby 继承了这些怪癖。
考虑到这些怪癖,如果所有其他方法都失败了,您总是可以不时执行 sleep 0.01 以稍微错开执行并为其他作业腾出 CPU 时间,您可以确定地执行此操作 (sleep 0.01 if count%100==0
) 或者您可以不确定地执行此操作以获得几乎相同的效果和更简单的代码 (sleep 0.01 if random(100)==0
) - 并使用确切的数字 (1, 10, 100, 1000, ...),
据我所知,EventMachine 在反应器线程中使用 sleep 0.01 来防止锁定 CPU,这种方法并不像一开始听起来那么古怪。
【讨论】:
看起来 linux java 不允许你降低线程的优先级,除非你是 root ......这太可笑了。 不确定这是否可行,但对于其他阅读本文的人,您可能想尝试一下:tech.stolsvik.com/2010/01/…以上是关于扭矩箱服务:漂亮吗?的主要内容,如果未能解决你的问题,请参考以下文章
微服务中的事务发件箱模式与 ChainedKafkaTransactionManager