我可以更改 XPC 服务的服务质量级别吗?
Posted
技术标签:
【中文标题】我可以更改 XPC 服务的服务质量级别吗?【英文标题】:Can I change an XPC Service's quality of service level? 【发布时间】:2021-03-18 13:54:14 【问题描述】:我希望在我的应用中放置一个 XPC 服务,该服务需要即时处理用户输入(它从单独的进程接收)。
QOS 状态的documentation:
在 XPC 服务中,主线程以默认的 QoS 运行
我需要能够将 XPC 服务线程设置为具有user-interactive
的 QoS,以确保用户输入事件以确保发生这种情况。
是否可以更改 XPC 服务线程的 QoS?
我知道我可以使用以下方法创建一个守护程序并设置任务策略:
struct task_qos_policy qosinfo;
memset(&qosinfo, 0, sizeof(qosinfo));
qosinfo.task_latency_qos_tier = LATENCY_QOS_TIER_0;
qosinfo.task_throughput_qos_tier = THROUGHPUT_QOS_TIER_0;
task_policy_set(mach_task_self(),
TASK_BASE_QOS_POLICY,
&qosinfo,
TASK_QOS_POLICY_COUNT);
做这样的事情,比如在 XPC 服务的 main 方法中,是实现这一目标的一种可能且适当的方式吗?
我当然可以创建一个守护程序,但我目前正在研究如何让我的架构与沙盒一起工作,以便我可以通过 Mac App Store 分发。
【问题讨论】:
你找到答案了吗? 这里有人遇到类似问题:developer.apple.com/forums/thread/682769。不幸的是,目前没有答案。 【参考方案1】:我们遇到了一个问题,即我们的 XPC 服务的性能比在我们的应用程序中运行相同的代码要差得多。摸索了几天,我们终于在“系统跟踪”工具的“上下文切换”部分找到了线索。我们的一些线程会有如下所示的“阻塞”条目:
00:09.911.098 Preempted at priority 4 for 32.44 ms because thread was taken off CPU temporarily to cool the processor and surrounding hardware.
在我们的场景中,33 毫秒的停顿非常糟糕。幸运的是,我找到了一个非常简单的解决方法。似乎只要有 XPC 回复块未被调用,XPC 服务就会提升其 QoS 级别。
所以解决方法如下:
-
在启动时,从应用程序向 XPC 服务发送消息。消息应包含 XPC 回复块。
XPC 服务收到消息后,保留回复块,但不要调用它。
在我的设置中,这将 XPC 服务保持在更高的优先级,因此我们不会被抢占。这是在 macOS 11.6 上。
【讨论】:
以上是关于我可以更改 XPC 服务的服务质量级别吗?的主要内容,如果未能解决你的问题,请参考以下文章