2017年10月9日 星期一

Raspberry Pi 3 的系統監控與自製散熱解決方案

通常樹莓派都是以 Headless computer (沒有外接螢幕與鍵盤滑鼠)的方式運作,而用作家庭物聯網(IoT)伺服器、監視器主機或是檔案伺服器的情況也是一樣,通常都是把樹莓派放在一些比較難以觸及或看到的地方,可能掛在高處,也可能放在數據機旁邊

而這種應用環境會出現一些運用上的問題,像是最常見的散熱與系統運作問題,首先講一下散熱問題

Raspberry Pi Model B 來說,採用的 BCM2835 SoC 在待機溫度上已經達到了 48.7°C,滿載溫度也有 55.7°C,負責 USB 埠與網路功能的 LAN9512 也可以達到 62.4°C 的高溫,在長時間的運作下可能會出現運作緩慢甚至當機的情況,因此要在晶片上黏貼散熱片,並視情況加上風扇去排出累積的熱量

下面就是各種嘗試過的散熱方案


2017_09_02_170830
一開始就有在背面的記憶體顆粒貼上散熱片
2017_09_02_170800
系統晶片 BCM2837 SoC 與負載時散發高溫的 LAN9514 也有貼上
2017_09_04_124840
省略上蓋直接放進自製支撐架
2017_09_13_020040
想加裝風扇所以弄了自製支撐架第二代
2017_09_13_020310
使用一顆六公分的風扇,驅動電壓五伏特的特規品
2017_09_13_111910
結果風量是有了,但風切聲很大,到了沒有安裝護罩都很吵雜的程度
2017_09_15_222428
只好再弄了自製支撐架第三代,改用九公分風扇
2017_09_15_222446
一開始採購的轉接線太長要繞著支撐架內部
2017_10_05_010054
改用自製轉接頭之後就可以直接接上

散熱問題解決之後,再來是軟體跟系統上的監控,你可以使用一些自動化腳本來監控,並在發生異常時提醒你去處理,當然樹莓派內建的硬體看門狗也是必須的,安裝看門狗之後可以在系統負載異常、處理器溫度過高、網路流量異常時重新啟動,端看你怎麼去設定監控函數

而我也額外寫了一些基於 Python 的小程式來監控,並使用 Crontab 來達成自動化運作,並在異常時通知我,我把撰寫好的程式放在 GitHub 上,Suzhou65/RaspberryPi-Automatically-Report


2017_10_05_192647
透過 Crontab 就可以讓這些基於 Python 的小程式自動運作
2017_10_05_193028
在排程好的時間就可以自動寄出系統溫度報告,並且在指定程式異常時發送通知(這是示範

再來講一下如何達成自動監控指定程式

在 Linux 系統中有所謂的 ps 指令,可以列出運作中的程式與系統程序,而透過調整參數,可以取出你想要的結果,再加以過濾,並搭配判斷式,就可以做出一定的操作

當然這邊是去查詢定程式是否在系統層面上正常運作(沒有當機或是凍結),如果是程式內部錯誤可能沒辦法偵測


2017_10_08_000953
簡單示範,輸入 ps x 可以看到運作中的程式與細部狀態
2017_10_08_001137
添加 grep 可以篩選出指定的程式
2017_10_08_001626
撰寫成 Python 腳本並搭配 awk 指令可以擷取指定輸出
2017_10_08_001641
這樣只會輸出指定程式的執行狀態與我想要的額外資訊
2017_10_08_001715
再加上一些替換子來去掉我不要的字符
2017_10_08_001735
就會輸出過濾後的字串
2017_10_08_001818
再加入判斷式去檢查是不是有符合我指定的字串
2017_10_08_001839
符合的話就會輸出這樣的結果

上面的範例是為了偵測 Hentai@Home 這套分散式運算系統是不是運作正常,因此我只要針對 HentaiAtHome.jar 這個程式作監測就好,將剛剛的判斷輸出改寫成電子郵件發送,就可以在偵測到異常時回報給我,並附上用於檢測的輸出結果來讓我判斷是不是真的有問題,還是說單純的誤報

只要輸出結果是 Sjava 則代表程式正常運作中,輸出 Sgrep 則是程式不在運作,其餘輸出則是程式當機或是凍結


2017_10_08_002738
這邊稍微修改一下判斷式,所以會把正常的狀況判定成異常並且回報
2017_10_08_002841
執行那個 Python 腳本就會輸出這樣的結果

理論上這樣就可以去偵測異常了,但我在兩個禮拜的運轉中有時會收到虛假的異常回報,顯示程式不在運作,但去檢查 Hentai@Home 頁面卻是正常的,因此做了一點研究

2017_10_08_215444
有時會收到這樣的異常回報,但程式其實是正常的

結果似乎是有時第一行輸出跟第二行輸出的順序會反過來,而 awk 只會抓取第一行,導致判斷式認為發生異常

而解決方法很簡單又暴力,直接兩行一起輸出再過濾跟判斷就好


2017_10_08_220309
將 awk 函數改成兩行都抓取,用替換子去掉我不要的字符後輸出
2017_10_08_220502
在替換子中去除換行字符
2017_10_08_220657
在讓判斷式去搜尋 Sjava 就好
2017_10_08_220646
執行 Python 腳本就會輸出這樣的結果,再把判斷輸出改寫成電子郵件發送就好

2017年9月16日 星期六

在 Raspberry Pi 3 上以 Raspbian 架設 Hentai@Home 分散式運算系統

前面一篇文章已經示範了用 Linux VPS 來運行 Hentai@Home ,而這次用被稱作樹莓派(官方名稱:Raspberry Pi )的開發用單板電腦來運行

或許很多人會想樹莓派跟一般電腦的架構完全不一樣( ARM 架構的 Broadcom BCM2837 之於一般電腦的 x86-64 處理器)怎麼可能跑這些東西,但其實只要是使用跨平台的方式去撰寫,比如用 Python 或是 Qt 模式去撰寫的軟體通常都可以在各種平台上運行,而 Hentai@Home 這種運行在 Java 架構上的軟體更不是問題

這篇省略了一些前面講過的東西,像是設定 DHCP 保留,將樹莓派的內部網路位址固定,以及設定 DHCP/NAT 的傳輸埠指定,將特定的傳輸埠開放到網路( WAN )上、並轉發給內部網路( LAN )的指定網路位址,以及申請 Hentai@Home 客戶端、網頁上設定客戶端的部分,請參閱前一篇文章

首先來講一下要運行 Hentai@Home,在樹莓派所運行的 Raspbian 上需要安裝的軟體與設定


2017_09_15_104806
從終端機登入樹莓派
2017_09_15_104905
首先也是確定樹莓派可以 Ping 到 google.com 跟 Google Public DNS 的 8.8.8.8
2017_09_15_105003
再來跑個 sudo apt-get update 跟 sudo apt-get upgrade
2017_09_16_004231
使用 speedtest.py 腳本測速一下,確定樹莓派可以連線並跑出最大速度
2017_09_16_005405
sudo apt-get install trickle 安裝限速模組,抓個想要讓 Hentai@Home 跑的速度
2017_09_16_005502
大概抓個 2 Mbps 然後輸出測試結果,照前面的格式去填寫客戶端申請
2017_10_05_125226
sudo apt-get install default-jre 跟 sudo apt-get install default-jdk,之後 java -version 會像是這樣

其實一開始我也在想不安裝 Oracle Java SE 真的沒問題嗎,畢竟參閱不少資料都說需要 Oracle Java 套件,但跑起來確實是沒問題就是了

接著在講一下硬體的部分,樹莓派是使用 MicroSD 記憶卡當作系統硬碟來運作,即使用大容量的記憶卡,但考慮到頻繁的讀寫還是建議使用外接硬碟,畢竟跑 Hentai@Home 就是要越大的檔案快取空間( Files Served / Maximum Disk Cache Size )越好,弄顆有一定容量的外接硬碟是最佳解,剛好手上有一顆小容量的固態硬碟,可以在讀取速度跟耗電量上取得不錯的平衡,畢竟樹莓派的 USB 埠最大輸出電流量只能到 1200mAh


2017_10_05_010030
左邊是樹莓派跟它的風扇,右邊是中華電信光世代的數據機
2017_10_05_010044
快門速度的關係,讓風扇看起來像停轉
2017_10_05_010158
這條是自製的 USB 轉 3 Pin 風扇座
2017_10_05_010054
樹莓派跟自製風扇罩
2017_10_05_010104
用自製迷你轉接頭供電給自己的風扇,也供電給數據機冷卻風扇、
2017_10_05_010140
固態硬碟跟外接盒用 3M 魔鬼氈固定在櫃子頂部

接下來要把外接的固態硬碟掛載到樹莓派的系統,並能被運行的 Raspbian 系統存取使用,也就是說要把外接硬碟內部資料清空、刪除原先的分隔表、建立新的 GPT 分割表與一個 Ext4 格式的分割區,因此請確定這顆硬碟裡面沒有你需要的資料

而 Linux 的硬碟管理邏輯跟 Windows 不太一樣,因此可能很多人不能理解把硬碟掛載到資料夾這個概念,沒關係,照作就好(欸?


2017_10_04_135304
使用 df -h 指令顯示系統上的磁碟區跟可用空間
2017_10_04_135504
lsblk 指令顯示硬碟分割狀態跟分割區
2017_10_04_141850
接上外接硬碟並重新開機後可以看到硬碟 sda 與磁碟區 sda1
2017_10_04_141909
使用 fdisk -l 來檢視硬碟與磁碟區的詳細資料
2017_10_04_141914
最下面的 /dev/sda 就是外接硬碟
2017_10_04_142022
使用 sudo fdisk /dev/sda 來編輯外接硬碟,先 d 後 w 來刪除硬碟上的分割表與磁碟區
2017_10_04_142155
再來一次 sudo fdisk /dev/sda 來建立磁碟區,先 n 後 p、1、然後按兩次輸入,最後來個 w 儲存
2017_10_04_142618
使用 sudo mkfs.ext4 /dev/sda1 來將分割區格式化成 Ext4
2017_10_04_142640
結果是這樣,將 /dev/sda1 格式化成Ext4
2017_10_04_145026
使用 sudo mkdir /media/hd 來建立一個資料夾,之後外接硬碟會掛載在這裡,並用第二行的指令給予它權限
2017_10_04_143953
ls -lh /dev/disk/by-uuid 可以看到硬碟與分割區的 UUID,sudo blkid /dev/sda1 列出外接硬碟分割區的 UUID
2017_10_04_145142
記住剛剛的 UUID,編輯 fstab 來達成開機自動掛載外接硬碟
2017_10_04_145420
在最下面加入剛剛的 UUID,並指向 /media/hd
2017_10_04_145558
重新開機後外接硬碟就會掛載到 /media/hd 下
2017_10_04_145958
再輸入一次 sudo chmod 777 /media/hd 給予它權限

再來就跟前面一篇文章的步驟一樣,在 /media/hd 建立一個 hath 資料夾

把 HentaiAtHome.jar 丟進 /media/hd/hath,並設定 sudo chmod +x HentaiAtHome.jar

建議安裝一下 screen 這個套件來有效管理 Hentai@Home,畢竟 SSH 終端機登出就會關掉程序這點還蠻討厭的,請參考這篇文章

再來就是在開啟的 shell 中啟動 HentaiAtHomeGUI.jar,在啟動指令中設定資料夾指向,填入客戶端編號與金鑰就可以完成


2017_10_04_173822
設定 /etc/motd 後可以在登入終端機時看到一些自訂提示
2017_10_04_155757
使用 df -h 指令就可以看到資料都儲存在外接硬碟
2017_10_05_124513
在 E-hentai 可以看到樹莓派上的客戶端已經連線,兩個客戶端 6000 KBps 大約是亞洲區的百分之二運算力
2017_10_05_125842
接著就是等著 Gallery Points 跟 Hath 入袋了

通常樹莓派都是以 Headless computer (沒有外接螢幕與鍵盤滑鼠)的方式運作,因此可以用一些自動化腳本來監控並在發生異常時提醒你去處理,當然樹莓派內建的硬體看門狗也是必須的,詳細請參考這篇文章

而我也額外寫了一些基於 Python 的小程式來監控,並使用 Crontab 來達成自動化運作,並在異常時通知我,我把撰寫好的程式放在 GitHub 上,可以自由取用,Suzhou65/RaspberryPi-Automatically-Report


2017_10_05_192647
使用 Crontab 來來達成自動化運作,回報處理器溫度與 Hentai@Home 異常運作
2017_10_05_193028
定時回報處理器溫度與在 Hentai@Home 異常時回報