分享一些多年來的經驗。

網路上看到 Percona 對於 Linux 上調校 MySQL / Percona 的文章,『Linux performance tuning tips for MySQL』。覺得有幾點可以補充及修正。

  1. 檔案系統建議 XFS,原因很多就不說明了。
  2. 現在參數其實已經不用再加 noatime 了。Linux kernel 在 2.6.30 之後,預設都是使用 relatime (XFS 甚至早在 2006 年就已實作),效能幾乎與 atime 沒什麼差,而且還能維持時間的正確。
  3. 若你還是習慣加 noatime 也可以,但不用再加 nodirtime。因為 noatime 包含 nodirtime,從 fs/inode.c 的 touch_atime 函式原始碼就可以看得出來。這也是為什麼一般只看到有人加 noatime 而沒有 nodirtime 的原因。
  4. Linux I/O schedular 建議用 deadline 或 noop,因為 XFS 在一般預設的 cfq 中效能有明顯變差。
  5. vm.swappiness 可以設定,會好一點。
  6. CPU 動態時脈調節程式可以關掉。原因很簡單,就是系統少跑一點服務,實質上就會快一點。
  7. 然後還有一些其它的系統參數可以調校。

不過,現在還有多少人還在玩系統的,該不會只剩一群老人了吧… 想起年輕時,手邊只有跑不動的破舊電腦,為了榨出效能,每個小環節都要去計較的時代。現代資源多到很多人都直接在雲端多開一台機器就好了。

最後針對第 4 點的補充,附上 fs/inode.c 一部分的原始碼:

void touch_atime(struct vfsmount *mnt, struct dentry *dentry)
{
        struct inode *inode = dentry->d_inode;
        struct timespec now;

        if (inode->i_flags & S_NOATIME)
                return;
        if (IS_NOATIME(inode))
                return;
        if ((inode->i_sb->s_flags & MS_NODIRATIME) && S_ISDIR(inode->i_mode))
                return;

        if (mnt->mnt_flags & MNT_NOATIME)
                return;
        if ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode))
                return;