2016-06-22 14 views
3

memcachedに奇妙な問題があります。私はherehereherehereおよびfew other placesを検索しました。だから私はindex.phpindex2.phpの2つのページがあります(ファイルの名前は気にしないでください)。Memcachedが応答に時間がかかりすぎる

index.php次のコードが含まれています

<?php 
    $data = file_get_contents('test.txt'); 
    echo "done"; 

そしてindex2.phpは、次のコードが含まれています

<?php 
function file_get_contents_new($filename, $memcache){ 
    $time = filemtime($filename); 
    $hash = md5($filename.$time); 
    $content = $memcache->get($hash); 
    if($content){ 
     return $content; 
    } 
    $content = file_get_contents($filename); 
    $memcache->set($hash, $content, 10000); 
    return $content; 
} 
$memcache = new Memcached; 
$memcache->addServer('localhost', 11211); 
file_get_contents_new('test.txt', $memcache); 
echo "done"; 

周り58967文字がランダムなサイトからHTMLソースを持っているもう一つのファイルtest.txtがあります約57.6kbです。今、私はindex2.phpをプロファイリングしようとすると、

file_get_contents shows 0% time

:私はindex.phpをプロファイリングしようとしたとき

は今、私は(私はデータを表示するには、プロファイリングとphpstormためxdebugのを使用しています)、次のプロファイリング結果を得ました私は、次のスナップショットを取得: shows $memcached->get() takes a lot of time

我々は$memcache->get()は、私は私のローカルマシン上のMemcachedを実行しているとして、あまり意味がありません。これは非常に長い時間がかかっていることをはっきりと見ることができます。

次に、多分それはちょっとしたエラーだと思って、Apacheのベンチマークツールabを試してみました。

Server Software:  Apache/2.4.20 
Server Hostname:  localhost 
Server Port:   80 

Document Path:   /index.php 
Document Length:  4 bytes 

Concurrency Level:  100 
Time taken for tests: 0.555 seconds 
Complete requests:  10000 
Failed requests:  0 
Total transferred:  2030000 bytes 
HTML transferred:  40000 bytes 
Requests per second: 18025.33 [#/sec] (mean) 
Time per request:  5.548 [ms] (mean) 
Time per request:  0.055 [ms] (mean, across all concurrent requests) 
Transfer rate:   3573.38 [Kbytes/sec] received 

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  0 0 0.1  0  1 
Processing:  1 5 0.8  5  19 
Waiting:  1 5 0.7  5  19 
Total:   2 5 0.7  5  19 

Percentage of the requests served within a certain time (ms) 
    50%  5 
    66%  6 
    75%  6 
    80%  6 
    90%  6 
    95%  7 
    98%  7 
    99%  8 
100%  19 (longest request) 

その後、私は非常に遅く、奇妙で、次の試験ab -n 10000 -c 100 http://localhost/index2.php

Server Software:  Apache/2.4.20 
Server Hostname:  localhost 
Server Port:   80 

Document Path:   /index2.php 
Document Length:  4 bytes 

Concurrency Level:  100 
Time taken for tests: 9.044 seconds 
Complete requests:  10000 
Failed requests:  0 
Total transferred:  2030000 bytes 
HTML transferred:  40000 bytes 
Requests per second: 1105.72 [#/sec] (mean) 
Time per request:  90.439 [ms] (mean) 
Time per request:  0.904 [ms] (mean, across all concurrent requests) 
Transfer rate:   219.20 [Kbytes/sec] received 

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  0 0 0.1  0  1 
Processing:  6 79 71.1  76 5090 
Waiting:  6 79 71.1  76 5090 
Total:   7 79 71.1  76 5090 

Percentage of the requests served within a certain time (ms) 
    50%  76 
    66%  78 
    75%  79 
    80%  81 
    90%  85 
    95%  89 
    98%  93 
    99% 107 
100% 5090 (longest request) 

をした:私は実行され、正確なコマンドはかなり速かったとの結果があっab -n 10000 -c 100 http://localhost/index.php ました。二次記憶装置からの読み取りよりもメモリからの読み取りが遅いのはなぜですか?それとも、彼らはfile_get_contents

私はかなり強いです働いているコンピューター上のいくつかのキャッシュを実装しましたし、設定は次の通りです:

  • MANJARO OS(Linuxカーネル4.1.26-1)
  • 16ギガバイト次メモリ
  • 256ギガバイトSSDは
  • インテルCore i7プロセッサー

編集:@ ShiraNai7がコメントしたように、私はトライサーバーのURLを127.0.0.1以下に変更すると、Apacheのベンチマークツールの結果となります。

Server Software:  Apache/2.4.20 
Server Hostname:  localhost 
Server Port:   80 

Document Path:   /index2.php 
Document Length:  4 bytes 

Concurrency Level:  100 
Time taken for tests: 11.611 seconds 
Complete requests:  10000 
Failed requests:  0 
Total transferred:  2030000 bytes 
HTML transferred:  40000 bytes 
Requests per second: 861.25 [#/sec] (mean) 
Time per request:  116.111 [ms] (mean) 
Time per request:  1.161 [ms] (mean, across all concurrent requests) 
Transfer rate:   170.74 [Kbytes/sec] received 

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  0 3 47.0  0 1009 
Processing:  6 113 67.6 105  633 
Waiting:  6 111 67.1 103  633 
Total:   6 116 82.5 106 1197 

Percentage of the requests served within a certain time (ms) 
    50% 106 
    66% 135 
    75% 153 
    80% 167 
    90% 204 
    95% 235 
    98% 286 
    99% 334 
100% 1197 (longest request) 

これは改善されていますが、多くはありません。そして、なぜそれが/etc/hostsにあり、それが私のローカルマシンに座っているので、DNSルックアップがなぜそんなに長くかかるのか分かりません。

編集:APCが続行されているかどうかを確認しようとしましたが、見つからなかったので、Opcacheモジュールが見つかりました。それはなぜfile_get_contentsが高速ですか?

私はhosted私のphpinfoが私のマシンでどのように見えるかを見ることができるjsbinです。

+0

する* 127.0.0.1 * DNSルックアップは、ここで犯人ではないことを確認するために*ローカルホスト*変更してみてください。 – ShiraNai7

+0

こんにちは@ ShiraNai7、私は大幅に改善された127.0.0.1にローカルホストを変更しようとしましたが、コメントが文字の制限を持っているので、まだそれは遅すぎる、私は私の質問を編集し、ありがとう。 –

+0

ちょうど私の2c、Redisのためのmemcachedの溝...より良いパフォーマンスと頭痛の少ない。 – Eric

答えて

0

まあ、私はこの疑問の背後にある謎を知りました。最初の手がかりはfile_get_contentsだった。 SSDを使っていても、それほど速くはありません。だから、私は一晩中掘り起こし、面白い情報を見つけました。

これは、file_get_contentsもキャッシュされた情報を返すためです。 PHP自体にはキャッシュは含まれていませんが、Linuxシステムにはファイルキャッシュが組み込まれているため、データへのアクセスが非常に高速になります。

参考:page cache

関連する問題