我可以更改 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 服务的服务质量级别吗?的主要内容,如果未能解决你的问题,请参考以下文章

在TFS 2010构建质量更改后发布到FTP

XPC 客户端等待服务加载

你可以在插件中运行 XPC 服务吗? (例如,打印对话框扩展插件)

线程和 XPC

通过 XPC 或 MACH 在 OSX 上启动服务

Kibana:运用 transform 来实现服务质量目标(SLO)的可视化