现在已经有越来越多的人开始使用桌面Linux发行版了,也经常会听到有人抱怨各种桌面Linux的运行速度比他们想象的慢。实际上,在使用桌面Linux系统时,你必须记住一个关键的问题:
桌面端Linux的快慢主要取决于系统响应速度,而不是硬件配置。
在使用服务器端Linux时,你确实可以通过提高硬件性能获取更快的系统运行速度,这是Linux得以在服务器端压倒众多竞争对手的最重要原因,通过优化调整硬件配置获得最佳的系统性能。
但在桌面端情况就不一样了,比如在把一个20GB的大文件复制到U盘,或者解压一个大文件的时候,你会很奇怪为什么Linux比Windows和MacOS表现的还要差劲。一般来说,绝大多数桌面端Linux用户在感到系统运行不够快的时候,首先就会想到和配置服务器一样添加硬件配置,然而这么做是不对的。
真正的瓶颈在哪里?
CPU一般不是瓶颈所在,除非你做的是密集计算任务,比如视频压缩、数据科学、遗传学和神经网络分析等。
GPU也很少产生瓶颈,除非你拿计算机玩大型游戏或超高精度渲染效果图,大多数时候你并不会真的需要一个7000美元的专用GTX 1080显卡。
如果测试一下CPU和GPU的使用情况,你就会发现它们大部分时间都是空闲的,没错,绝大多数时间计算机的核心都不会满载运行。
真正的瓶颈出现在内存与硬盘的I/O(输入/输出)这里。
RAM与SWAP
只要一打开光鲜亮丽的Chromium浏览器,你肯定会在几分钟之内打开十几个网页标签或者更多,这会在不知不觉中发生。
然而这样会超级快速的吃完8GB的内存。每当出现这种情况时,操作系统就开始把数据分载到硬盘的缓存中,此时你就会发现机器的速度严重下降。
所以你可能要做的第一件事就是安装一个扩展,比如Chrome的内存优化插件Great Suspender。它会暂时关闭掉所有标签的网页响应,除了现在你正在阅读的这个,而当你切换到另一个标签时,它就会重载这个标签的网页。Great Suspender的目的是节省内存,效果很好。
(内存优化插件Great Suspender)
这个扩展可以帮你节省几个G的内存,对于平均配置内存为8GB的Linux系统来说,这可不是个小事。
另外需要考虑的是Linux的预配置会将应用数据平均分派到swap来利用文件系统的缓存。所以如果你解压一个大文件,一些数据就会进入到RAM缓存,应用数据也会进入硬盘,而在解压完成后,重新切换到应用程序时往往出现无法响应的问题。
所以你需要配置一下操作系统,让应用程序的状态充分保存在RAM中。在控制台中进行如下操作:
sudo tee -a /etc/sysctl.d/99-sysctl.conf
vm.swappiness=1
vm.vfs_cache_pressure=50
EOF
在存储方面,有时你会发现一些使用旧核心的存储器比如U盘或SD卡拖慢了机器的速度,这时可以进行如下操作:
sudo tee -a /etc/sysctl.d/99-sysctl.conf
vm.dirty_background_bytes=16777216
vm.dirty_bytes=50331648
EOF
如果不想立刻重新启动,可以在终端上运行如下命令:
sudo sysctl -w vm.swappiness=1
sudo sysctl -w vm.vfs_cache_pressure=50
sudo sysctl -w vm.dirty_background_bytes=16777216
sudo sysctl -w vm.dirty_bytes=50331648
对RAM和SWAP的调整不宜做的太过,比如千万不要禁用文件系统日志,因为这样会增加数据遭受破坏的风险。
优化调度程序
Linux中配置了过程调度程序(Process Scheduler)和I/O调度程序(I/O Scheduler)。过程调度程序负责管理内核的预处理级别与不同计算任务之间的切换。而I/O调度程序则帮助不同的过程比如从硬盘读取和写入内存等共享I/O资源。
桌面端Linux中使用的调度程序一直在更新,最通用的过程调度程序是Completely Fair Scheduler (CFS) ,它在许多版本中是默认配置,其后还有更新发布的Staircase,BFS和MuQSS等。同样的,I/O调度程序也在不断进步,除了通用的Completely Fair Queueing (CFQ)之外,还有更新的Noop Scheduler和BFQ等。
你可以应用这些最新的调度程序来优化系统,最好的办法是安装Linux Zen 内核,Liquorix版本。它用MuQSS 调度程序替换了CFS,用BFQ替换了CFQ,同时还加入了更多的响应性调整比如QoS over TCP,用来避免TCP堵塞。
如果你用的是Arch Linux,要做的非常简单:
sudo pacman -Sy linux-zen
sudo grub-mkconfig -o /boot/grub/grub.cfg