Select Page
最佳化你的 NFS 效能,讓檔案伺服器也會飛

最佳化你的 NFS 效能,讓檔案伺服器也會飛


調整NFS(Network File System)的效能可以從多個角度進行,包括調整NFS伺服器和客戶端的參數、網絡配置、以及文件系統的選擇。

調整 NFS 參數:

NFS Server 端

  • 使用 NFSv4: NFSv4 提供更好的效能和安全性。
  • 根據工作負載調整 rpc.mountd.port 和 rpc.nfsd.port 參數的值。
  • 調整 nfsd.minthreads 和 nfsd.maxthreads 參數的值,以優化執行緒數量。
  • 調整 nfs.readahead 和 nfs.writebehind 參數的值,以優化讀寫緩衝區大小。

範例如下

我的主機是 4VPU,4G RAM來設計

修改 /etc/nfs.conf 文件(或你系統中相對應的配置文件),設置最小執行緒數為 8,最大執行緒數為 64

調整邏輯,將 nfsd.minthreads 和 nfsd.maxthreads 參數設置為與 CPU 核心的數量相同或是略高一些

[nfsd]
threads=8 64

編輯 /etc/sysctl.conf

# NFS Setup
nfsd.minthreads =8
nfsd.maxthreads = 64
nfs.readahead = 65536
nfs.writebehind = 262144

重啟主機

sudo service nfs-kernel-server start

NFS Client 端

  • 使用 NFSv4: NFSv4 提供更好的效能和安全性。
  • 調整 mount.nfs.rsize 和 mount.nfs.wsize 參數的值,以優化讀寫緩衝區大小。
  • 調整 mount.nfs.mountd_port 和 mount.nfs.nfsd_port 參數的值。

調整邏輯,將 mount.nfs.rsize 和 mount.nfs.wsize 參數設置為與 TCP MTU 相同或是略低一點

範例如下

sudo /etc/fstab

/etc/fstab

server:/path/to/share /mnt/nfs nfs rw,nfsvers=4,noatime,rsize=32768,wsize=32768 0 0

提高讀取的性能

mount -o async,noac,rsize=1048576 nfs://server/share /mnt

兼顧安全性以及效能的設定可以參考

mount -o async,noac,noatime,nodev,noexec,norecovery,rsize=1048576,tcp,nfsvers=4 nfs://server/share /mnt

讀取大型文件,如影音,透過 readahead 來幫助提高性能,這裡將 readahead 設置為 128 塊(每塊的大小依賴於系統配置,通常是 4KB)

sudo mount -t nfs -o rsize=32768,wsize=32768,readahead=128 server:/path/to/share /mnt/nfs

調整網路配置:

  • 使用高性能網路設備。
  • 調整 TCP/IP 參數,例如 tcp_keepalive 和 tcp_window_size

常見的 NFS 掛載選項

  • async: 允許 NFS 客户端在將數據寫入磁碟之前將其發送到伺服器。這可以提高寫入性能,但可能會導致數據丟失。
  • bg: 在後台掛載 NFS 共享。
  • intr: 允許 NFS 客户端在伺服器無響應時中斷操作。
  • noac: 不使用 NFS 屬性緩衝區。這可以提高性能,但可能會導致文件屬性不一致。
  • noatime: 不更新文件的訪問時間。這可以提高性能,但可能會導致文件元數據不準確。
  • nodev: 不將 NFS 共享上的設備映射到本地設備。
  • noexec: 不允許在本地執行 NFS 共享上的可執行文件。
  • norecovery: 在 NFS 伺服器發生故障時不嘗試重新掛載共享。
  • ro: 以唯讀模式掛載 NFS 共享。
  • rsize: 設置 NFS 客户端每次讀取操作從伺服器接收的最大數據量。
  • rw: 以讀寫模式掛載 NFS 共享。
  • soft: 在 NFS 伺服器無響應時允許 NFS 客户端重試操作。
  • tcp: 使用 TCP 而不是 UDP 進行 NFS 通信。
  • timeo: 設置 NFS 客户端在伺服器無響應之前等待的時間。
  • nfsvers: 指定 NFS 協議版本

其中最常用到的是 async, noac, noatime, rsize, nfsvers.

noatime

多數情況下,禁用對文件訪問時間的更新可以提升性能,因為它減少了對伺服器的寫操作。

rsize和wsize:

對於現代網絡,32768(32KB)或65536(64KB)是比較常見的設定值,能夠提供良好的效能。你可以從這個基點開始,進行實際的性能測試來找到最適合你環境的值。

NFS 版本的比較說明 (nfsvers)

  • NFSv4 比較新,提供了更好的安全性(如Kerberos身份驗證)和效能優化,包括更高效的文件鎖定機制和狀態保持功能。
  • NFSv3 在一些舊系統上仍然很流行,對於不需要v4的安全性增強的環境來說,可能仍是一個好選擇。在某些情況下,它可能由於其無狀態性而提供更好的效能。

監控與調整

使用 nfsstat 這樣的工具來監控 NFS 伺服器的性能,然後根據實際運行情況進行調整。

sudo apt install nfsstat

之後就可以輸入 nfsstat 取得相關資訊

nfsstat

高效能伺服器

使用 NFS Ganesha: NFS Ganesha 高性能的 NFS 代理伺服器

實戰教學:實現Ubuntu環境中高效的硬碟共享

在Ubuntu中要分享硬碟給另一台電腦,通常有兩種方法:使用網絡文件系統(NFS)與 Linux 或使用 Samba 與 Windows 共享。

以下是這兩種方法的步驟:

方法1:使用NFS(適合Linux系統)

安裝NFS服務器:

在提供共享的電腦上,打開終端並輸入以下命令安裝NFS服務器:

sudo apt update
sudo apt install nfs-kernel-server

配置共享目錄:

編輯/etc/exports文件來添加你想要共享的目錄。例如,如果你想共享/srv/nfs目錄,可以添加如下行:

sudo nano /etc/exports
/srv/nfs    *(rw,sync,no_subtree_check)

其中*表示所有人都可以訪問,rw表示讀寫權限,sync表示同步寫入硬碟,no_subtree_check是速度比較快的選項。

重啟NFS服務:

sudo systemctl restart nfs-kernel-server

在客戶端電腦上安裝NFS客戶端

sudo apt install nfs-common

掛載共享目錄:

sudo mount server_ip:/srv/nfs /mnt

記得把 server_ip 換成你分享主機的 IP

方法2:使用Samba(適用於Windows和Linux系統)

安裝Samba:

在提供共享的電腦上,安裝Samba:

sudo apt install samba

配置Samba共享:

輯Samba配置文件/etc/samba/smb.conf,在文件末尾添加如下配置:

sudo nano /etc/samba/smb.conf
[ShareName]
path = /srv/samba
read only = no
browsable = yes

請記得替換 ShareName 為你的共享名,/srv/samba 為你想共享的目錄。

重啟Samba服務:

sudo systemctl restart smbd

在另一台Ubuntu上訪問Samba共享:

可以在文件管理器的地址欄輸入 smb://server_ip/ShareName 來訪問共享,其中 server_ip 是Samba服務器的IP地址,ShareName是你設置的共享名。

Windows 上則是用檔案總管,並且在文字框內輸入 \\server_ip\ShareName

no_subtree_check 參數說明

no_subtree_check 是 NFS(網絡檔案系統)配置中的一個參數,用於改善NFS服務的性能。這個參數的作用與含義如下:

  1. 子樹檢查(Subtree Checking): 在NFS中,子樹檢查是一個安全特性,用來確保客戶端訪問的檔案仍然是它最初打開時的那個檔案。這是通過檢查檔案所在的目錄結構來實現的。如果檔案在檔案系統中被移動或重命名,NFS會通過子樹檢查來識別這些改變。
  2. no_subtree_check 的作用: 啟用 no_subtree_check 參數會禁用這種子樹檢查。這意味著NFS服務器不會檢查檔案是否被移動或重命名。這樣做可以提高性能,因為減少了服務器的檢查負擔。在大多數情況下,這是安全的,特別是在檔案不太可能在訪問期間被移動或重命名的環境中。
  3. 應用場景: 在許多常規的NFS使用情況下,子樹檢查是不必要的,因為檔案的移動並不頻繁。在這些情況下,禁用子樹檢查可以提供更佳的性能表現,尤其是在處理大量的檔案請求時。

分享文件的安全性設定

要限制特定IP地址的主機才能连接NFS共享,您需要在NFS的配置文件 /etc/exports 中明确指定允许的IP地址。以下是具体步骤:

編輯/etc/exports檔案:

sudo nano /etc/exports

指定允許的IP地址:

/etc/exports檔案中,您可以為每個共享目錄指定允許訪問的IP地址,我們要做的事情是把前面的*號替換成主機的IP。例如,如果您想只允許IP地址為192.168.1.100的主機訪問名為/srv/nfs的共享目錄,您可以這樣寫

/srv/nfs 192.168.1.100(rw,sync,no_subtree_check)

這行配置表示僅有IP地址為192.168.1.100的主機可以讀寫(rw)訪問/srv/nfs目錄。

您可以精確控制哪些IP地址的主機被允許訪問NFS共享。如果需要允許多個特定的IP地址,只需在/etc/exports檔案中的相應行裡添加這些IP地址,每個地址用空格分開。例如:

/srv/nfs 192.168.1.100(rw,sync,no_subtree_check) 192.168.1.101(rw,sync,no_subtree_check)

重啟NFS服務:

sudo systemctl restart nfs-kernel-server

開機時自動建立 NFS 連接

可以將 NFS 掛載點添加到客戶端主機的 /etc/fstab 文件中。/etc/fstab 文件用於在系統啟動時自動掛載文件系統。以下是一般步驟:

編輯 /etc/fstab 文件:

sudo nano /etc/fstab

添加 NFS 掛載條目:

[NFS 伺服器 IP]:/[遠端共享目錄] [本地掛載點] nfs defaults 0 0

如果 NFS 伺服器的 IP 是 192.168.1.100,遠端共享目錄是 /exported/folder,本地掛載點是 /mnt/nfs,則添加:

192.168.1.100:/exported/folder /mnt/nfs nfs defaults 0 0

測試掛載: 為了檢查是否有語法錯誤,您可以手動掛載所有未掛載的 fstab 條目

sudo mount -a

其中在 /etc/fstab 文件中,每個掛載點的條目都包含一系列的字段,其中 defaults 0 0 是其中的兩個字段,意思如下

  1. defaults 這是掛載選項字段。defaults 代表一組預設的掛載選項。對於大多數文件系統,這包括了 rw(可讀寫)、suid(允許執行 suid 程序)、dev(解析字符和塊特殊裝置)、exec(允許執行二進制文件)、auto(允許自動掛載)、nouser(阻止普通用戶掛載文件系統)、和 async(進行異步 I/O)等選項。如果需要特定的選項,可以用逗號分隔,直接在這個位置列出。
  2. 第一個 0 這是 dump 字段。dump 是一個備份實用程序,用來決定文件系統是否需要被備份。如果這個值設置為 0,則 dump 將忽略這個文件系統。如果設置為 1 或更高的數字,它表示文件系統的備份頻率。
  3. 第二個 0 這是 fsck(文件系統檢查)的順序字段。這個數字決定了在啟動時檢查文件系統的順序。如果設為 0,系統啟動時將不會對這個文件系統進行 fsck 檢查。如果是根文件系統,這個值通常設為 1;其他文件系統則設為 2 或更高,或者保留為 0

總的來說,defaults 0 0 是一個常見的配置,

要將掛載好的硬碟卸載的話

要卸載已經掛載的硬碟,您可以使用 umount 命令

確定掛載點:

df -h

卸載硬碟:

例如,如果硬碟掛載在 /mnt/mydisk,則命令為:

sudo umount /mnt/mydisk

檢查卸載狀態:

可以再次使用 df -hmount 命令來確認硬碟已經被卸載。

解決權限無法讀寫的問題

兩台主機間有不同的帳號,A主機帳號usera,B主機帳號userb,要再b主機修改a主機的資源的話,你會遇到無法執行的問題

可以選擇兩種策略

1.使用群組權限

如果 userauserb 的 UID/GID 不同,您可以通過將它們都加入到同一個群組,並對該群組授予適當的權限來解決問題。

在 A 和 B 主機上創建相同的群組

sudo groupadd sharedgroup

userauserb 添加到該群組:

在 A 和 B 主機上分別執行:

sudo usermod -a -G sharedgroup usera
sudo usermod -a -G sharedgroup userb

更改共享目錄的群組權限:

在 A 主機上設置共享目錄的群組為 sharedgroup,並確保群組具有讀寫權限:

sudo chown usera:sharedgroup /path/to/shared/directory
sudo chmod 2770 /path/to/shared/directory

2. 使用 NFS 伺服器選項映射 UID/GID

可以在 NFS 伺服器的 /etc/exports 文件中使用 all_squash, anonuid, 和 anongid 選項來映射所有客戶端用戶到特定的 UID 和 GID。

編輯 /etc/exports 文件

在 A 主機(NFS 伺服器)上編輯此文件,為共享目錄添加以下選項:

/path/to/shared/directory B主機的IP(rw,sync,no_subtree_check,all_squash,anonuid=UID,anongid=GID)

其中,將 UIDGID 替換為在 A 主機上 usera 的 UID 和 GID。

UID 和GID的查詢方法如下

id usera

就會取得像是 uid=0(root) gid=0(root) groups=0(root)

重啟 NFS 服務:

sudo systemctl restart nfs-server

這樣配置後,所有從 B 主機存取 A 主機共享目錄的操作都將以指定的 UID 和 GID 來執行,從而繞過 UID/GID 不匹配的問題。


GCP 連接外部硬碟

先看配置 df -h ,在用 lsblk 找出要配置的硬碟,通常在 GCP 中新掛的第一顆硬碟代號會是 sdb

df -h
lsblk

如果是全新的硬碟要先格式化他

sudo mkfs.ext4 -m 0 -F -E lazy_itable_init=0,discard /dev/sdb

格式化後,可以開始準備掛載目錄,以及提升權限和下指令掛載

sudo mkdir -p /mnt/data
sudo chmod a+w /mnt/data
sudo mount -o discard,defaults /dev/sdb /mnt/data

最後記得要設定每次開機自動掛載,先用 blkid 找出硬碟的 UUID ,記錄下來後再把他填到 /etc/fstab 中

sudo blkid /dev/sdb
sudo nano /etc/fstab

將設定檔寫入 fstab

UUID=1535732s45-a52a-4e22-a258-7bsedgaw3e41 /mnt/data ext4 discard,defaults 0 2

存檔完畢後,測試一下是否有成功

sudo mount -a

延伸閱讀

如何定時打開和關閉 GCP VM Nginx WEB 達到省錢目的

如何定時打開和關閉 GCP VM Nginx WEB 達到省錢目的

建立一個會自動開機和關閉虛擬機器的排程

值得注意的事項:

  • 主機時間都是 UTC 時間,設定的時候,要記得處理這邊,例如台灣時區是+8,所以設定時間的時候要-8

1.首先設定一個 Compute Engine 的 「執行個體排程」如圖所示

2.建立一個新的執行個體排程

設定在每天18:00到23:00最忙碌的時候多開一台主機

3.將要執行的 VM 個體加入到此排程中

記得建立好排程後,要把適用這個規則的 VM 個體都加入,GCP 的排程才會去處理 VM 的開關

4.執行排程的權限設定

如果你之前沒做過權限設定,那肯定會遇到權限不足的錯誤訊息,這時候要來到 IAM 與管理 -> 身分與存取權管理,並且先勾選「包含 Google 提供的角色授權」,然後選擇「授予存取權」

然後主體要選擇你自己的 compute-system.iam 指派角色則是選擇 Compute 執行個體管理員(v1),如圖所示

建立 Ubuntu or Debian 的 Shell Script 定時執行開關機

1.建立自動開關設定的 Script

#!/bin/bash

SOURCE_CONF="/path/to/a.conf"
TARGET_CONF="/path/to/nginx/nginx.conf"

# 使用 sudo 執行需要 root 權限的命令
sudo cp "$SOURCE_CONF" "$TARGET_CONF"
sudo nginx -s reload

2.可以使用 crontab 命令來檢查和管理定時任務(cron jobs)

sudo crontab -e

加入執行時間、程式碼等設定

# 分 鐘 小時 日期 月份 星期 命令
0 23 * * * /path/to/update_nginx_conf.sh

這樣就可以利用 root 權限運行 Script

其中:

  • 分鐘:分鐘(0-59)
  • 小時:小時(0-23,採24小時制)
  • 日期:一個月中的某天(1-31)
  • 月份:月份(1-12)
  • 星期:星期幾(0-7,其中0和7都代表星期日)
  • 命令:要執行的命令或腳本的絕對路徑

例如,如果您希望每天凌晨 3 點執行一個名為 script.sh 的腳本,您應該這樣寫:

檢查

檢查 crontab 列表:輸入 crontab -l 來確認您的任務已被添加到 crontab 列表中。

其他方法

at 指令

例如要讓指令碼在明天的 10:00執行,可以執行下面的指令

at 10:00 AM tomorrow /path/to/script.sh

systemd (System and Service Manager)

  1. 創建一個 systemd 定時任務檔案。
  2. 在定時任務檔案中指定要執行的命令或腳本以及執行時間。
  3. 啟用定時任務。

例如:每一分鐘都要執行一次 script.sh

[Unit]
Description=My Script

[Timer]
OnCalendar=*-*-* *:* *

[Service]
ExecStart=/path/to/script.sh

錯誤處理

如果有遇到無法執行權限的話,可以參考下面的文章解決權限問題

結語

這樣設定完成後,GCP自己就會在晚上11點關機、晚上6點開機,而我的腳本則是在晚上11:00 關閉 Nginx 的 upstream,在18:15開啟 upstream server

Ubuntu 20 用 Speedtest 測網速

Ubuntu 20 用 Speedtest 測網速

如果OS有圖形化的介面,可以透過瀏覽器瀏覽 speedtest.net 去測試網速,但來到了 Linux base 的 Ubuntu command line 上頭,就需要安裝 SpeedTest 的 Script 腳本,透過腳本來檢查網速。

安裝 Python

因為 SpeedTest 是用 Python 寫的,所以先打開終端機,先把 Python3 pip 裝起來

sudo apt-get install python3-pip

安裝 SpeedTest

透過 pip3 安裝 SpeedTest

sudo pip3 install speedtest-cli

用 SpeedTest 測試網速

speedtest-cli

用 SpeedTest 測試網速並且分享

speedtest-cli --share

結果會是

https://www.speedtest.net/result/13144792277.png

Pi-Hole – Raspberry Pi 上程式開發以及阻擋廣告用的 DNS SERVER

Pi-Hole – Raspberry Pi 上程式開發以及阻擋廣告用的 DNS SERVER

很多時候為了內部程式開發方便或是安裝 wordpress 時候會需要不同的 DNS 名稱,你也可以編修自己電腦中的 host 名單,讓你開發者可以利用 Domain 去安裝 wordpress,或是也可以自己架設一個 DNS SERVER 來處理這件事情,但現在有比較好的選擇,可以兼顧程式開發以及去除廣告的好處,設定又很容易,且還可以安裝在小巧的 Raspberry Pi 上,可以不用透過外面的 DNS 去做繁瑣的設定,非常的加分。

Pi-hole 安裝方法

Pi-hole的安裝很簡單,在 Raspberry Pi 中只要一行,其他的就看圖片精靈回答問題即可

curl -sL "https://install.pi-hole.net/" | sudo bash
初始安裝畫面
告訴你安裝了 Pi-hole 就可以幫你去除煩人的廣告
Pi-hole 別忘了,有能力的人要貢獻點小費,施比受有福
Pi-hole 選擇你上層的 DNS SERVER 台灣建議用 Google 即可
Pi-hole 選擇廣告阻擋清單的供應者,目前也只有一個可以選擇
Pi-hole 是否要安裝管理的介面,為了以後方便,預設把它裝起來吧
Pi-hole 這一段是問要不要安裝 lighttpd 和 PHP 模組,當然你也可以用自己的 web server ,但為了方便起見,用預設的 web server 即可,他不會佔用太多的硬碟空間。
Pi-hole 是否要有記錄檔,當然要囉
Pi-hole privacy mode , https://docs.pi-hole.net/ftldns/privacylevels/,用預設不隱藏任何東西,所有統計數據都可用即可
看到這個畫面就完成安裝,可以將電腦中的 DNS 指向畫面中的 IP ,需要進入管理介面的輸入 http://pi.hole/admin
國外網友超專業教學

Raspberry Pi 多種應用

PiHole官網 – https://pi-hole.net/

PiHole替代品 AdGuard,https://github.com/AdguardTeam/,AdGrard 安裝在 Raspberry Pi 上的說明,https://github.com/AdguardTeam/AdGuardHome/wiki/Raspberry-Pi