对毒瘤软件说「不」:macOS 如何限制 CPU 占用

Cocoa开发者社区

共 2492字,需浏览 5分钟

 ·

2021-07-07 17:41

很早之前大家就发现,macOS 的活动监视器真的就只是一个监视器,并不能像 Windows 的任务管理器那样可由用户手动设置进程的优先级。但当我们真的有这样的需求时,该怎么办呢?

我们知道,其实苹果的 macOS 是一个半开半闭源的操作系统,大致来讲,GUI 部分是闭源的,这也是 macOS 的精髓;核心系统部darwin-xnu)是开源的。这使得用户或者说开发者依然有机会进行系统调用,以实现需求——限制某个进程的 CPU 资源占用。

也许你会好奇,什么人会有这种需求呢?当某些公司强制要求员工们安装「xx 安全软件」并且时不时还在后台疯狂扫描文件吃 CPU,还不准你关闭和卸载的时候,你就有这个需求了。

方案一:cputhrottle

关注少数派,在后台回复「CPU」即可获得下载链接。

这个小工具没有 GUI,是个很轻便的命令行工具。从介绍便知:

cputhrottle is a small OS X command-line utility designed to limit the CPU usage of a process to which it attaches.

作者在其官方页面提供了源码下载和编译好的二进制执行文件。原本我以为这种 OS X 时代的软件已经不适用于现在版本的系统了,结果仍然可用,这估计得益于稳定的内核带来的良好兼容性(基本不会有哪个 OS 内核经常改系统调用的)。

在下载 cputhrottle.gz 解压后,我们需要先给予执行权限:

chmod +x cputhrottle

然后就可以直接使用了,第 1 个参数是进程的 pid,第 2 个参数是最大 CPU 占用百分比,假设某安全软件进程 id 为 2333,你只准它最多吃你 1% 的 CPU:

sudo ./cputhrottle 2333 1

# 一般来说,你可以用 ps 命令来查看进程的 pid
ps -ef
# 如果太多了不好找,可以筛选一下,前提是你要知道它可能的名字
ps -ef | grep "xx 安全软件或者它的英文名 "

这样就能保证它又不被杀死,还不拖慢你的电脑,可谓 「求死不得,求生不能」。为了使用方便,我们可以把执行文件放到 /usr/local/bin 目录下面,以后就可以在任意目录下直接执行了:

mv cputhrottle /usr/local/bin
# 以后可作为全局命令使用
sudo cputhrottle 2333 1

然而,在执行命令后,由于程序内部是死循环逻辑,所以会占用当前终端。更优雅的做法当然是让它到后台去执行,不影响我们终端的继续使用:

sudo cputhrottle 2333 1
# 执行命令后按下 control 和 Z,以挂起进程,终端会提示如下
# ^Z
# [1] + 12345 suspended sudo cputhrottle 2333 1

# 然后接着在终端输入 bg,会提示进程继续执行,这样就到后台
bg
# [1] + 12345 continued sudo cputhrottle 2333

如果觉得 bg 这种方式比较麻烦,也可直接用 nohup 命令:

sudo nohup cputhrottle 2333 1 &

上述 12345 是举例,它是你执行 cputhrottle 命令的进程 id,当你不再需要限制 2333 进程的 CPU 占用时,可以 kill 掉它:

sudo kill 12345

方案二:AppPolice

关注少数派,在后台回复「CPU」即可获得下载链接。

上面的方案一比较原始,比较熟悉终端的同学可以试试,适合喜欢自己写命令脚本的配合使用。后面的方案都是带 GUI 的软件了,适合普通用户。

AppPolice 和 cputhrottle 一样,也是开源的,2016 年的老古董软件了,亲测也可用。在其 GitHub 仓库下载 dmg 后,安装就能用了。

图标还挺有趣的……红蓝应该是 Police 的配色

运行后可以直接控制每个应用进程的 CPU 占用,最大就是无限制,相比命令工具,的确还是很方便的。

方案三:App Tamer

此软件不是开源的,并且是付费软件,亲测也可用,从 UI 和功能上面看起来比方案二更成熟一点。安装之后首次打开会提示安装必须的附属工具。

首次使用还有引导页面,做了一些基本功能的介绍。

其实使用起来和上述的 AppPolice 差不多,都是可以手动限制每一个进程的 CPU 最大占用。

并且还提供了全局开关,在不用退出的情况下关闭限制,需要的时候再打开。各种功能也是要丰富得多,但基本上我这一张截图也就体现完了。

总体来说要比前面两个方案完美很多。不过正版的价格也不菲呢,14.95 刀。

方案四:Turbo Boost Switcher

这个软件严格意义上来说和上面三者不是一个意思,它主要是开关 Intel 处理器的 Turbo Boost 的(Enable / Disable Turbo Boost feature on demand.),后者即英特尔的睿频技术(简单理解为自动超频),关它说白了也是为了省电,让 CPU 处于低频状态。

所以不是用来限制进程 CPU 占用的,而是全局节能的。我觉得挺神奇的,就放到这里了,看来用户的需求真是千奇百怪呢。

探索

由于 cputhrottle 的源码比较少,我就稍微看了看,发现核心逻辑还是不复杂的,会根据指定进程的 CPU 使用时间来采样,计算出需要控制的占比,最终通过系统调用(Mach 内核 task 相关的接口,这个 task 在 macOS 的内核中相当于进程的概念)来挂起 task,并休眠一定的时间,达到让出 CPU 资源的目的。


浏览 47
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报