memcached - PHP緩衝:Memcache 不如 直接File檔案快取嗎

來源:互聯網
上載者:User
使用本地的環境測試10萬次和 100萬次 緩衝的讀寫,測試環境和結果如下。

環境

Win7 x64 AMD7750雙核 記憶體8GApache 2.4.9PHP 5.5.12 ts vc11 memcache 2.2.7 

代碼

connect('127.0.0.1', 11211);    $data = $mem->get($key);    if (empty($data)) {        $data = date('Y-m-d H:i:s');        $mem->set($key, $data);    }    return $data;}$t1 = microtime(true);$i = 0;$limit = 1000 * 100; //10 萬次$data = null;while ($i < $limit) {//    $data = cacheFile($i);    $data = cacheMem($i);    $i++;}$timeUse = microtime(true) - $t1;$arr = [    'cost' => sprintf('%.7fs', $timeUse),    'mem' => convert(memory_get_usage())];var_dump($arr);

結果 1萬次

            花費時間           記憶體耗費File        1.9 sec           250kbMemcache    11 sec            250kb

結果 10萬次

            花費時間    記憶體耗費File        94s        251.18KBMemcache    逾時120s 報錯 

Memcache 10萬次測試失敗,報錯內容如下

Warning: Memcache::connect(): in D:\localhost\speed.php on line 37Warning: Memcache::get(): No servers added to memcache connection in D:\localhost\speed.phpWarning: Memcache::set(): No servers added to memcache connection in D:\localhost\speed.php on line 41Fatal error: Maximum execution time of 120 seconds exceeded in D:\localhost\speed.php on line 38

結論

memcache 用來做緩衝卻還沒有 直接File檔案快取快,之所以做這個測試,是因為面試的時候我回答自己並沒有使用這個memcache 來做緩衝,直接使用File檔案快取,結果直接被技術官認定為是初級程式員。但我通過這樣的測試,雖然是在win下面,可為什麼Memcahe效能還不如File ?
還是說我測試的方式存在錯誤?

2015-8-21 20:52:17
改進後,真的速度快了N倍! 10萬毫無壓力。17.18 sec 265KB記憶體

function cacheMem($key){    static $mem = null;    if ($mem === null) {        $mem = new Memcache();        $mem->connect('127.0.0.1', 11211);    }    $data = $mem->get($key);    if (empty($data)) {        $data = date('Y-m-d H:i:s');        $mem->set($key, $data);    }    return $data;}

回複內容:

使用本地的環境測試10萬次和 100萬次 緩衝的讀寫,測試環境和結果如下。

環境

Win7 x64 AMD7750雙核 記憶體8GApache 2.4.9PHP 5.5.12 ts vc11 memcache 2.2.7 

代碼

connect('127.0.0.1', 11211);    $data = $mem->get($key);    if (empty($data)) {        $data = date('Y-m-d H:i:s');        $mem->set($key, $data);    }    return $data;}$t1 = microtime(true);$i = 0;$limit = 1000 * 100; //10 萬次$data = null;while ($i < $limit) {//    $data = cacheFile($i);    $data = cacheMem($i);    $i++;}$timeUse = microtime(true) - $t1;$arr = [    'cost' => sprintf('%.7fs', $timeUse),    'mem' => convert(memory_get_usage())];var_dump($arr);

結果 1萬次

            花費時間           記憶體耗費File        1.9 sec           250kbMemcache    11 sec            250kb

結果 10萬次

            花費時間    記憶體耗費File        94s        251.18KBMemcache    逾時120s 報錯 

Memcache 10萬次測試失敗,報錯內容如下

Warning: Memcache::connect(): in D:\localhost\speed.php on line 37Warning: Memcache::get(): No servers added to memcache connection in D:\localhost\speed.phpWarning: Memcache::set(): No servers added to memcache connection in D:\localhost\speed.php on line 41Fatal error: Maximum execution time of 120 seconds exceeded in D:\localhost\speed.php on line 38

結論

memcache 用來做緩衝卻還沒有 直接File檔案快取快,之所以做這個測試,是因為面試的時候我回答自己並沒有使用這個memcache 來做緩衝,直接使用File檔案快取,結果直接被技術官認定為是初級程式員。但我通過這樣的測試,雖然是在win下面,可為什麼Memcahe效能還不如File ?
還是說我測試的方式存在錯誤?

2015-8-21 20:52:17
改進後,真的速度快了N倍! 10萬毫無壓力。17.18 sec 265KB記憶體

function cacheMem($key){    static $mem = null;    if ($mem === null) {        $mem = new Memcache();        $mem->connect('127.0.0.1', 11211);    }    $data = $mem->get($key);    if (empty($data)) {        $data = date('Y-m-d H:i:s');        $mem->set($key, $data);    }    return $data;}

錯在你不該在while裡寫connect...哪有每次都去串連的?

首先,建立一個到Memcached的TCP串連的開銷肯定要比開啟一個本地檔案大,而在你的cli測試中,反覆建立了上萬次串連,而在Web上(比如PHP-FPM,MOD_PHP),可以使用到Memcached的持久串連,也就是一個PHP-FPM背景工作處理序保持一個Memcached的長串連,用於處理多個不同的請求:
http://php.net/manual/zh/memcached.construct.php

其次,作業系統會緩衝本地檔案到記憶體(就是Linux上的buffers/cache),讀效能肯定是不錯的,但是頻繁的寫效能肯定沒有Memcached好,因為Memcached讀寫操作都保證在記憶體中完成。

另外,Memcached能實現分布式(由用戶端實現,比如PHP的PECL擴充memcached),這個也是本地檔案快取不具備的優勢。Memcached的分布式體現在將不同的鍵儲存到不同的伺服器上。
http://php.net/manual/zh/memcached.addserver.php

注意:PHP有兩個針對Memcached的PECL擴充,一個叫做memcache,一個叫做memcached:
http://php.net/manual/zh/intro.memcache.php
http://php.net/manual/zh/intro.memcached.php
其中基於libmemcached的擴充memcached實現了分布式,而memcache則沒有實現。

上面說的對,你的測試方法是錯誤的,因為memcache已經達到最大串連數了,所以報錯

不過我想知道你用的是什麼磁碟,SSD or FIO or SAS,IOPS是多少;說明一下,memcache中key最大值為250B,value最大值為1M,一般情況下value大於1M,也就是超過memcache中page的大小時候,memcache也就無能為力了,不過你可以通過更改原始碼來實現或者換redis(value最大值512M)

其實也不必測試,memcache資料全部放在記憶體中,然而記憶體和磁碟不是一個層級,我們可以分析一下:

1納秒等於10億分之一秒,= 10 ^ -9 秒

Numbers Everyone Should KnowL1 cache reference 讀取CPU的一級緩衝     0.5 nsBranch mispredict(轉移、分支預測)     5 nsL2 cache reference 讀取CPU的二級緩衝     7 nsMutex lock/unlock 互斥鎖\解鎖     100 nsMain memory reference 讀取記憶體資料     100 nsCompress 1K bytes with Zippy 1k位元組壓縮     10,000 nsSend 2K bytes over 1 Gbps network 在1Gbps的網路上發送2k位元組     20,000 nsRead 1 MB sequentially from memory 從記憶體順序讀取1MB     250,000 nsRound trip within same datacenter 從一個資料中心往返一次,ping一下500,000 nsDisk seek  磁碟搜尋     10,000,000 ns Read 1 MB sequentially from network 從網路上順序讀取1兆的資料     10,000,000 nsRead 1 MB sequentially from disk 從磁碟裡面讀出1MB     30,000,000 ns Send packet CA->Netherlands->CA 一個包的一次遠端存取     150,000,000 ns

我們關注一下記憶體和磁碟的訪問速度,上面是指隨機訪問,那麼相差1000 000倍,但如果是順序訪問的話大約為 7倍

樓主應該好好看看設計模式,你的面試官沒說錯你。。。可能初級程式員都懂得緩衝對象吧。。誰會每次迴圈都串連一次memcached?

如果用file存的話, 100w 請求,你去看下伺服器的硬碟讀寫。伺服器早掛掉了。

磁碟IO延遲和資源開銷和檔案系統開銷也挺大得。

我只想問哈樓主是用什麼測出PHP已耗用時間的?

事實證明 你就是1、2年的初級。 但是當時面試官否認掉你 沒跟你講明原因嗎?

還有給你 也是給所有人一個忠心的建議,切忌不要太浮躁! 或是自我膨脹,以目前時間為節點來看,自己永遠是井底之蛙,不經曆一些事情有可能不會明白。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.