使用本地的環境測試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年的初級。 但是當時面試官否認掉你 沒跟你講明原因嗎?
還有給你 也是給所有人一個忠心的建議,切忌不要太浮躁! 或是自我膨脹,以目前時間為節點來看,自己永遠是井底之蛙,不經曆一些事情有可能不會明白。