2016/10/31

封箱文 Netgear AC3200 R8000

家裡的 Asus RT-N16 的封包處理速度開始跟不上設備的擴增,現在網路流量高一點,無線網路就開始抽筋、甚至直接斷線。所以開始尋覓高一階的網路設備。


這次看上的是 Netgear AC3200 R8000,主要是有傳說中超大的覆蓋路,還有 smart connect 可以對 mobile 設備到 AP 這段做自動負載平衡。



這台應該是我看過最大台的 Wifi AP router,最長邊大約有 30cm,原本擺 RT-N16 的位置根本放不下。開機以後 2.5G + 5G x 2 全開,號店功率大約 12w。

在設定 R8000 時,可以同時開啟二個不同頻斷的 5G SSID,選擇所在地為「臺灣」時,第一個 5G chaneel 被限制在 40 附近,第二個 5G chennel 則是在 140 左右。

查過 NCC 5G 開放的頻率以後,就會知道 R8000 5G 第一組頻段在台灣很多無線設備根本不支援,開起來也沒有用。若選擇 smart connect 技術,將二個訊號發射器合併起來使用時,頻段又被現在在 channel 30 附近,台灣的無線網路設備根本之支援嘛,相當於 smart connect 完全派不上用場。

另外一個我有點在意的是無線訊號的覆蓋率,我用手機裝 inSSIDer 來觀察訊號強度,把二台 RT-N16 和 Netgear R8000 放在房間裡,隔了一道牆到客廳觀察訊號強度,二台的訊號強度幾乎一致。

雖然可以刷 DD-WRT 來繼續使用,但是訊號不強,其實對我來說也沒什麼留下來的說服力。於是就先退貨了。

網路上很多也 R8000 多好多好的文章,我這邊就只留下我個人不滿的幾個點。剩下交給各位客官自己判斷了。


Ref:

2016/10/23

PHP copy-on-write 特性

「copy on write」這個特性的意思是,在 variable 在沒有異動的時候,不會在記憶體中 re-allocate 一個新的區塊來存放資料,只有在被更新、修改或刪除資料時,才會另外將異動過的資料存放到記憶體其他區域。

剛看到時自己寫不知道這是什麼神奇的東西,看實例比較快。

先建立一個超級大的檔案 huge.log:
$content = file_get_contents('huge.log');

// 818.4 MB
echo sprintf("%.1f MB\n", memory_get_peak_usage() / 1024 / 1024);

建立一個 function,這個 function 什麼事都不做,直接回傳我們傳進去的 $content:
$content = file_get_contents('huge.log');

function reply($content)
{
    return $content;
}

reply($content);

// 818.4 MB
echo sprintf("%.1f MB\n", memory_get_peak_usage() / 1024 / 1024);

well ... 我以前原本以為 pass by value,會另外將 variable clone 一份供 function 內部使用,但上面的 script 中呼叫了 reply() 以後,記憶體用量並沒有增加,所以將變數傳進 function 時,並沒有 clone 一份新的出來。


將原本的 reply() 稍做調整,在 return 之前新增一點東西到 $content 中:
function reply($content)
{
    return $content . 'some more';
}

reply($content);

// 1636.6 MB
echo sprintf("%.1f MB\n", memory_get_peak_usage() / 1024 / 1024);

reply() 中對 $content 加了一些新的資料,這時候最大記憶體使用量就變為原來的 2 倍,很明顯 PHP 在記憶體 alloc 新的區塊來存放被修給過的 $content。所以「copy on write」的意思,就是這個資料被 write 時,PHP 才會要新的記憶體 (copy) 來存放有被修改過的資料。



處理大型資料時,可以利用這個特性來節省記憶體使用量。

例如:decorator() 這個 function 要對一個大型陣列的資料做處理:
function decorator($data)
{
    $sum = 0;
    foreach ($data as $item) {
        $sum += $item;
    }
    $data['average'] = $sum / count($data);
    $data['sum'] = $sum;

    return $data;
}

上面的 function 因為會修改 $data 的內容,所以 PHP 會 clone 一個 $data 再來做修改。

改成以下的寫法:
function decorator($data)
{
    $sum = 0;
    foreach ($data as $item) {
        $sum += $item;
    }

    $change = [
        'average' => $sum / count($data),
        'sum' => $sum,
    ];

    return $change;
}

foreach (decorator() as $key => $val) {
    $data[$key] = $val;
}

在 decorator() 並不會動到 $data 的內容,所以不需要 clone $data,而是在 function 執行結束以後,直接對 $data 做修改。這樣只需要多儲存 $change 陣列,和後續的處理動作,而不會讓使記憶體用量 double。

2016/10/20

WD 高雄服務中心地點更換

之前 WD 的特約服務中心是在 SET 復得科技那邊,但今天要送修硬碟時才發現 SET 已不再代為服務,地點改到雷德硬碟資料救援那邊去。

走路看到廣告招牌才知道這件事情,然而 WD 官方網站則完全找不到任何訊息,實在很不爽。

so ... 2016/07/01 以後,WD 的服務中心改至雷德硬碟資料救援

地址:高雄市三民區建國二路152號
營業時間:請參考公司網站說明

Synology 的套件庫及管理工具 ipkg

一直以為 Synology 的 DSM 上面,只有預設的套件管理工具和社群套件可以安裝使用,但這實在不夠力。

昨天因為 S.M.A.R.T. 檢測失敗 (但也沒寫問題在哪裡),所以只好找 badblocks 來手動測試。badblocks 一次市要跑數個小時的,若因為網路不穩斷線會導致 process 被中斷,只能重跑,至少要裝個 session / screen manager 來支援 (我習慣用 GNU screen)。

後來搜尋後找到 ipkg 這項套件管理工具,安裝完畢以後可以用類似 ubuntu aptitude 的操作方式來安裝套件。

常用工具都已經有包好可以直接下載使用,像是 htop、screen 等等,可以透過 ipkg search / install 來使用。binary 預設放在 /opt/bin 底下,再調整一下 PATH 即可直接呼叫。


Ref:

2016/10/15

增加 MySQL insert 速度的撇步

一次要新增大批資料到 MySQL 時,就會 MySQL 吃 CPU 又卡 I/O wait,這個時候如果沒時間吃下午茶的話實在會有點不爽 (?)

假設今天有個 table 長這個樣子:
mysql> desc users;
+--------------+---------------------+------+-----+---------+-------+
| Field        | Type                | Null | Key | Default | Extra |
+--------------+---------------------+------+-----+---------+-------+
| id           | bigint(20) unsigned | NO   | PRI | NULL    |       |
| email        | varchar(200)        | YES  |     | NULL    |       |
| display_name | varchar(500)        | YES  |     | NULL    |       |
| reg_date     | int(10) unsigned    | YES  |     | NULL    |       |
| last_login   | int(10) unsigned    | YES  |     | NULL    |       |
| delete_at    | int(10) unsigned    | YES  |     | NULL    |       |
+--------------+---------------------+------+-----+---------+-------+

登入、使用者管理等動作,我們會為以下幾個欄位加上 index 以加快查詢速度:
  • email
  • reg_date
  • last_login
  • delete_at

這個時候我們新增一筆資料時,MySQL 大概會做幾個動作:
  1. 新增一個 row
  2. 更新 index
    1. 更新 email index
    2. 更新 reg_date index
    3. 更新 last_login index
    4. 更新 delete_at index

所以如果只是把新增一筆資料,事情最多的不是建立一個 record,而是更新所有的 index。假設要新增的資料有 10000 筆,新增資料的 I/O 就當作 10000 次好了,更新 index 就另外再增加 40000 次 I/O。

若這 10000 筆資料是一次處理完,且不打算中斷,是否有發法可以減少 index 處理的次數?答案是 transaction。

當 10000 個 insertion 放在同一個 transaction 時,MySQL 會在 insertion 確認成功以後再來一次 update index。也就是說原本 update index 跑 40000 次,現在只需要跑 4 次。

由於 transaction 會造成 lock,新增資料前可以先試試看一個 transaction 要新增幾個 record,lock 的時間才不會影響到其他服務的運作。

ref:

2016/10/10

塔塔加 10 分鐘遊


本來打算連假走塔塔加抒發一下最近累積的壓力,不過天公不做美,連續下了幾天的雨,到了塔塔加遊客中心以後就決定往回走了。

由於下午的關係,阿里山到塔塔加的路並不好走,中途有部份地段有落石,也有路基不穩的狀況,建議上山之前還是要注意一下道路狀況。

塔塔加遊客中心,除了有賣紀念品以外,也有阿里山生態的教育影片,二樓則有餐廳。餐廳主要是以桌菜為主,雖然有單點但價位都不低,倒是 200 元的單人套餐份量和品質都很棒。

塔塔加遊客中心 200 元的單人套餐