2017年2月24日 星期五

使用dbench 進行硬碟效能測試

最近遇到需要大量進行儲存系統讀寫的要求,因為包含了samba 硬碟,查了一下發現了dbench 這個測試程式,就試用了一下,它支援本機的測試,也支援samba, iscsi跟nfs 測試:

本測試需安裝 dbench 進行測試,在Linux 主機上使用下列指令取得dbench。
git clone https://github.com/sahlberg/dbench

先安裝要測試網路硬碟所需的library:
sudo apt-get install libiscsi-dev
sudo apt-get install smbclient
sudo apt-get install libsmbclient-dev
sudo apt-get install samba-dev
sudo apt-get install libnfs-dev
在dbench 中使用下列指令編譯,configure 要加的參數來自這個gist,才能找到samba client library:
https://gist.github.com/Labisana/6d94b7db13b08be586ce
./autogen.sh
./configure CFLAGS="-I/usr/include/samba-4.0/"
make
make install

完成編譯dbench,在測試機上,可以使用dbench來進行測試,簡單的如:
./dbench --loadfile=loadfiles/client.txt -t <TIME> <THREAD>
或是想要測試遠端的samba server:
./dbench -B smb --smb-share=//<IP>/<DIR> --smb-user=<USER>%<PASS> --loadfile=loadfiles/smb_1.txt -t <TIME> <THREAD>

各欄位說明如下:
<IP> <DIR>:samba之IP位址及資料夾名稱。
<DIR> <USER> <PASS>:samba使用者之帳號與密碼。
<TIME>:測試時間
<THREAD>:使用多少程序進行測試。
如果是nfs 或iscsi 的話,應該會需要其他的參數以設定登入,不過手邊沒有nfs 或iscsi 可以測試,只好先跳過。

loadfile 是dbench 的測試檔案,裡面可以描述想要dbench 執行的讀寫動作,例如開檔、寫檔等等,如果寫得好,它應該可以重現一般使用者真實的讀寫狀況,不過我都直接用它在loadfiles 資料夾中預設的檔案,如上面的smb_1.txt。
自己試過在超過50 個thread 的時候,samba很容易出現寫入錯誤,所以保守一點就用50 個thread 就是了,如果是本機測試的話,就不用這麼保守;不過話說回來一般本機上也不會有這麼多人一起用你的電腦就是了。
執行之後,dbench 就會印出測試的報表:
Operation                Count    AvgLat    MaxLat
--------------------------------------------------
Flush                      849   117.384   207.657
Close                     9000     0.003     0.117
LockX                       40     0.006     0.019
Rename                     520     0.078     3.887
ReadX                    19240     0.007     1.723
WriteX                    6039     0.056    11.209
Unlink                    2480     0.058     3.291
UnlockX                     40     0.003     0.005
FIND_FIRST                4300     0.035     0.162
SET_FILE_INFORMATION       990     0.090    10.150
QUERY_FILE_INFORMATION    1940     0.002     0.017
QUERY_PATH_INFORMATION   11350     0.013     8.822
QUERY_FS_INFORMATION      2040     0.004     0.048
NTCreateX                12260     0.020     8.160

Throughput 42.255 MB/sec  10 clients  10 procs  max_latency=207.669 ms

參考資料:
http://kongll.github.io/2015/04/24/dbench/
https://dbench.samba.org/doc/dbench.1.html

2017年2月22日 星期三

用vim 巨集整理文件格式

曾經有一次,從外面匯入一個project 的程式碼,林林總總大概10 幾個C 的source跟header,每個檔案幾十行到幾百行不等。
打開一看,關掉,哎呀我的眼睛業障重呀
唔…是沒這麼誇張,但裡面充斥著行末空白、排版有點糟糕,然後有些tab 跟空白混用,研究了一下,可以用vim 把這些程式都整理整理。

在刪掉trailing space 的部分用vim-better-whitespace:
https://github.com/ntpeters/vim-better-whitespace
這樣就能在文件中使用StripWhitespace 指令刪掉所有行末空白。
排版用vim 本身的排版功能,一般文件可以用 = 就會排好了,不過如果是python 的話就沒辦法,它不像C 有明確的分號跟大括號來表示縮排結束,所以這招對python 是沒用的,用了只會一直不斷的縮排下去。
把tab 換掉的部分,我基本上是space 派的(戰,這也可以用vim 的取代功能很快做完,不過我們要用ge 來suppress error ,以免文件中不存在tab 的狀況停掉巨集執行。

我們利用vim 的巨集功能,把上面幾個結果串在一塊,選一個喜歡的英文字母(這裡用y,因為我最喜歡y了),依序輸入下面的指令,打完一行就按一下enter,#後面的表示註解:

q
y #將巨集存在 y 暫存區
:StripWhitespace  #清除trailing space
:%s/\t/ /ge  #全文件取代tab 為雙空白
=G  #全文件重新排版
:w  #記得存檔,神明保佑(X
:n  #編輯下一份文件
q
然後關鍵的一步來了,我們的巨集在執行完就會跳到vim 暫存區的下一個檔案,現在,我們在project 目錄裡面,可以用 vim *.h *.c 一次打開所有程式檔案到暫存區。
接著只要 100@y,執行這個巨集100 次(好吧如果你檔案更多就選個更大的數字),巨集的執行會在 :n 沒有下一個檔案的時候停止,這樣就能把所有檔案的格式都整理得漂漂亮亮了。

2017年2月19日 星期日

gmail 碎紙機

電子郵件是個讓人又愛又恨的東西,基於工作的理由你實在不能不用它,各網站服務也都是用電子郵件帳號註冊跟認證,可是,一但加入會員就會不斷收到宣傳信,像是什麼<XX購物網>一直倒宣傳信過來,啊我沒錢不然你給我錢我買你的東西這樣可以嗎?然後像什麼求職廣告、防詐騙提醒,封鎖要是鎖掉了真正重要的信件又很麻煩。工作上討論一次CC群組,每個人回信信就一直湧進來,多到要爆炸……嗯爆炸是不至於,畢竟我用的gmail 空間很大。

可是呢,每天刪信刪到手軟也很煩,突發奇想就寫了一個chrome extension,原始碼在這裡,可以載下來之後用<載入未封裝之擴充功能>來安裝:
https://github.com/yodalee/shred-my-gmail

我不但要刪掉信,在刪的同時還要把他給攪掉,用下面這個 extension boilerplate:
https://github.com/KartikTalwar/gmail-chrome-extension-boilerplate
搭配最新的 gmail.js
http://github.com/kartiktalwar/gmail.js

首先是在文件中插入一個 audio tag,並連結到我extension 中的mp3 檔
var a = document.createElement('audio');
a.id = "sound";
a.src = chrome.extension.getURL('shredder.mp3');
(document.head || document.documentElement).appendChild(a);
然後在main.js 裡面,載入gmail.js 之後,用gmail.js 的observe
gmail.observe.on("delete", playShredSound);
就能監看刪除事件,並用getElementById 取得audio element 並播放,就能做出信被攪掉的效果,聲音的來源是這裡:
https://www.youtube.com/watch?v=ECstQgQZWXc
下載下來之後用audacity 把切削的部分取出來。

雖然信其實只是一樣進到垃圾桶裡而已,不過把垃圾信攪一攪就有一種爽感:「X的你們這些王八蛋垃圾信,看我把你們攪成碎片~~~」;我本來想說如果把信永久刪除的話,就放個燒掉的音效好了,最後覺得燒掉的聲音太難表現還是算了。

總之寫了一個自己爽的專案,感謝各位看倌貢獻的時間,文章最後附上示範影片連結:

2017年2月17日 星期五

柔珠、遊覽車與自由主義

過年從家裡拿了兩罐Biore 的男性洗面乳,用時仔細一看它標榜含有<黑白微粒柔珠>,好極了,這不是會通過汙水處理系統,已經公告明年禁用的產品嗎?當下決定立即停用,看怎麼處理掉它們。
會知道柔珠產品的危害,首先是來自於臉書上看到美國政府宣佈禁用的英文新聞,爾後台灣政府也旋即宣佈禁用,相關新聞看下來自然也對相關產品的議題有初步的了解。

柔珠議題其實是個小縮影:禁用柔珠的產品,也等於是政府介入自由市場,規定某些交易(交易含有柔珠的產品)不能發生,它的目的是為了防止柔珠產品進入大洋,透過食物鏈危害生態,甚而回頭危害人類。
商家應該有權利販售他們生產的商品,政府憑什麼介入?柔珠對生態造成的破壞很大,但反映到一般人眼中其實很小,政府是基於全民的健康,限制了某些交易的自由。如果把政府的角色拿掉,想透過市場力量把產品淘汰掉,社會必須先累積足夠的環保共識,由有識之士透過逐次的宣導讓大家拒用柔珠產品,真照完全自由主義的做法,別說柔珠,就是DDT、CFC 的禁用,大概也是耗日費時。
這也是組成政府的目的,提高某些規範與保障的效率。

套用到最近的遊覽車司機、一例一休跟Uber 案,政府的監管其實並不是那麼沒必要的,這其實也是人民、社會和政府間的一種妥協,我們授權給政府,讓它為我們分配資源、維持法律、督導業者、取締不法。
因為柔珠對生態造成的破壞,因為過勞<偶爾>發生的遊覽車車禍造成的死傷、因為計程車規格不統一而讓乘客吃的虧,放大一點看,政府之所以取締酒駕,不也是要防止酒駕的成本轉嫁到全民身上?
自由主義是一種理想,它假定市場是萬能的,就像個清新脫俗的美少女,政府介入都像鹹豬手一樣噁心,我認為這並非事實,也許政府管理並非永遠正確,甚至有些愚蠢,但它絕非無效。
有時,迷信自由主義過了頭,好像看不見的手能解決任何問題,當政府真的就該介入的時候,就轉而訴諸政府的管制是無效的,一切的原因都是消費者蠢,只能說也太過天真了。

在臉書這個世界最大的個人媒體,有機會看到很多為自由主義宣傳的文章,像是臉書專頁<真暴民的時事筆記>,對於遊覽車的新聞有著如下評論:「真正的進步,是懂得為自己負責的消費者帶領出來的。有什麼樣的需求,就有什麼樣的供給,光把法規修成歐規,騙得了自己也騙不了人。」
好像很合理?問題是我們到底要的是一個<我們是超自由社會好棒棒>的大旗,大家繼續等著無良業者被淘汰;還是由政府訂下一定的規則,讓大多數人遵守並依規定懲處不符規定的玩家?就如這幾天各國網友分享的,在各國規定之下,無論是雙司機、強制八小時工時等等法規限制,雖然提高了消費者負擔,卻也很有效的保障司機作為勞工的權益,也保護乘客的安全。

政府介入是假的進步,還是讓社會往更好方向前進的必須?

我們也可以照樣造句:
「真正的環保,是懂得環境保護的消費者帶領出來的,有什麼樣的需求,就有什麼樣的供給,修正法律禁止柔珠,騙得了自己也騙不了人」
「真正的治安,是懂得為自我規範的公民們帶領出來的。有什麼樣的人民,就有什麼樣的社會,光是立法懲罰,騙得了自己也騙不了人。」
都不知道在說什麼鬼話了…「把道德立成法律」由政府執行也許很噁心,但不立法律讓大家把道德當成法律,下場也不會好到哪裡去,說得更明白一點,現在會有過勞的問題,不正是政府放任業者依照成本和利潤壓榨司機的結果,自由經濟學真棒?

這就是自由主義最大的罩門:不是每個人都是全知全能,甚至我們必須承認,所有人的能力都不夠,才因而組成政府。
正因為勞資兩方是不公平的,因此我們組成政府,訂定勞基法來限制一些人壓榨其他人
正因為每個人追求最大利益會忽視如環保的外部性,因此我們組成政府來替我們取締不法,訂定環保法規。
正因為獨佔帶來不公平競爭,因此我們組成政府,對抗獨佔業者。
正因為市場存在資訊不對稱,因此我們組成政府禁止內線交易和炒作股票。

我們可以假想一個勞工跟資方站在平等立場的世界,不會有貧窮急需用錢的勞工,家裡不會有嗷嗷待哺的小孩,可以不急不徐的拒絕不合理的工作環境,向資方磨出一個合理的工資。在消費者跟司機全知的世界,消費者會自動拒絕過勞司機的旅行社,旅行社拉低條件會立即因為請不到人而倒閉,勞基法在這裡一無是處,但這不是現實。

這種錯誤很容易犯,迷信某些東西能把所有問題一掃而空,就跟迷信宗教一樣,我在開始接觸 Linux 的時候,也曾經成為<教徒>,覺得政府單位為什麼還要交微軟稅?作業系統全部用Linux 取代,Office 全部用Libreoffice 取代不就好了?見識多了,才會發覺事情不會這麼簡單。
舉著理想的大旗,很好,通常理想指向一個值得實現的目標;但請不要忘記社會的現實,只看著目標是會被路上的坑洞絆倒的。

相關資料:
為何加班拚不到經濟卻會傷害無辜?
http://www.ettoday.net/news/20170216/867311.htm

2017年2月14日 星期二

在Archlinux 上安裝mariadb筆記 (Install mariadb on Archlinux)

最近在我的Archlinux 上面安裝MySQL,結果撞了一堆牆,在這裡筆記一下過程,希望有機會的話能幫到其他使用者。
步驟就是照著wiki 所講,一步一步往下做:
https://wiki.archlinux.org/index.php/MySQL

首先因為Archlinux 已經改用mariadb ,MySQL 移去AUR,不過我試過,用yaourt -S mysql 也會裝mariadb ,一個由不得你的概念。
sudo pacman -S mariadb

使用mysql_install_db 設定好/var/lib/mysql
mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql

用systemd 啟動mariadb service
systemctl start mariadb
最後可以用mysql_secure_installation來進行安全設定

我在start mariadb 這步遇上問題,service 總是起不來,出現類似這樣的訊息,要不就是start mariadb 直接hang住:
Job for mariadb.service failed because the control process exited with error code.
See "systemctl status mariadb.service" and "journalctl -xe" for details."
使用systemctl status mariadb.service 之後,它會列出哪行指令出了錯,我記得沒錯的話是 /usr/sbin/mysqld,總之它開不了 /var/lib/mysql 中的某些檔案。
後來發現原因是,在安裝mariadb 的時候,理論上它要加上mysql 這個使用者,但原因不明的沒有加上去,因此我們要手動幫它補上:
groupadd -g 89 mysql
useradd -u 89 -g mysql -d /var/lib/mysql -s /bin/false mysql
chown mysql:mysql /var/lib/mysql

然後重跑上面的mysql_install_db,就能順利的把mariadb 跑起來了