性能優化/啟動過程

出自 Arch Linux 中文维基


本文將為讀者提供數種加速系統啟動的方法。通過學習實踐這些方法,讀者不僅能改善系統性能,還能學習系統啟動腳本的知識。

啟動過程分析[編輯 | 編輯原始碼]

使用 systemd-analyze[編輯 | 編輯原始碼]

systemd提供了一個名為 systemd-analyze 的工具, 可用於顯示有關啟動過程的計時細節, 包括一個svg圖, 顯示等待其依賴項的單元. 您可以看到哪些單元文件導致啟動過程減慢, 然後可以相應地優化系統.

要查看啟動時在內核/用户空間中消耗的時間, 只需使用:

$ systemd-analyze
提示:如果使用 UEFI 引導, 且啟動引導器實現了 systemd 的 Boot Loader Interface (目前只有 GRUBsystemd-boot 實現了), systemd-analyze 還可以顯示 EFI 固件和啟動引導器自身花費的時間

按照耗費時間順序, 輸出啟動每個單元耗費的時間:

$ systemd-analyze blame

在開機過程的一些時刻, 需要特定的單元成功啟動了才能繼續. 查看在啟動鏈中哪些單元處於這些關鍵點, 可以:

$ systemd-analyze critical-chain

還可以生成類似於 bootchart 的開機過程圖表:

$ systemd-analyze plot > plot.svg

更多細節請參考 systemd-analyze(1).

使用 systemd-bootchart[編輯 | 編輯原始碼]

自2012年10月17日,bootchart 工具已經合併進 systemd 中,使用方法和原來的 bootchart 大同小異,添加下列內容到內核參數即可:

initcall_debug printk.time=y init=/usr/lib/systemd/systemd-bootchart

更多信息請查看 manpage

使用 bootchart2[編輯 | 編輯原始碼]

本文或本章節可能需要合併到Bootchart#Running Bootchart2

附註: different instructions from the main page(在 Talk:性能優化/啟動過程 中討論)

您還可以使用 Bootchart 來可視化引導序列. 由於沒有辦法在內核參數設置兩個 init, 所以不能使用源裡的 bootchart. 不過, AUR 軟件包 bootchart2AUR 提供了一個 systemd 服務. 在安裝完 bootchart2 後啟用服務即可:

# systemctl enable bootchart2.service

詳情參閱 bootchart2 文檔

自己編譯內核[編輯 | 編輯原始碼]

編譯自定義內核可以減少啟動時間和內存使用. 儘管隨着64位體系結構的標準化和Linux內核的模塊化特性, 這些好處可能沒有預期的那麼大

有關更多信息, 請參見:Kernel (簡體中文)#編譯

Initramfs[編輯 | 編輯原始碼]

類似於 #自己編譯內核, initramfs也可以精簡. 一個簡單的方法是包含 mkinitcpio autodetect 鈎子. 詳情請參見 Minimal initramfs.

提前啟動服務[編輯 | 編輯原始碼]

systemd 的一個核心特性就是 D-Bus 以及 socket 激活. 這會導致服務在首次訪問時啟動, 這通常是一件好事. 但是, 如果你知道某個服務 (比如 upower) 總是在引導過程中啟動, 那麼儘可能早地啟動它可能會縮短總體的引導時間. 可以通過以下方式實現 (如果這個服務有 service 文件, 多數情況下都是):

# systemctl enable upower

這會使 systemd 儘快啟動 UPower, 而不會導致 socket 或 D-Bus 激活的競爭.

Staggered spin-up[編輯 | 編輯原始碼]

有些硬件使用staggered spin-up,作業系統一個一個訪問硬盤,以減少耗電。這會降低啟動速度,大部分用户都不需要開啟。檢查是否開啟:

# dmesg | grep SSS

如果沒有查到,表示未啟動。如果有顯示,可以將libahci.ignore_sss=1 加入 kernel line 進行禁用。

避免重複掛載[編輯 | 編輯原始碼]

mkinitcpio提供了 fsck 鈎子,將啟動加載配置中的 root 從 ro 修改為 rw 並刪除 /etc/fstab 中的 root 掛載,可以避免重複掛載。掛載參數可以通過rootflags=[mount options...]設置。

刪除 /etc/fstab 中的 API 文件系統,systemd 會自動掛載它們。下面命令可以獲得這些 API 文件系統的列表:

$ pacman -Ql systemd | grep '\.mount$'

/home等其他文件系統可以通過自定義掛載單元進行掛載。

精簡輸出信息[編輯 | 編輯原始碼]

修改啟動加載器內核參數中的 verbosequiet 即可。對於某些用户,特別是 SSD 用户,TTY 的龜速實際上成為了性能瓶頸,精簡輸出信息實際上有利於提高性能。

參閱[編輯 | 編輯原始碼]