Php

伺服器每秒受到相當多的請求

  • May 2, 2012

我執行一個圖像託管網站。在高峰時段,我的伺服器每秒可以處理 8 個請求到每秒 20 個請求。我目前正在目前硬體上執行伺服器:

處理器 AMD 六核速度 6 核 x 2.8 GHz (3.3 Turbo Core) RAM 16 GB DDR3 ECC 硬碟空間 1,000 GB (2 x 1,000 SATA) RAID 軟體 RAID 1

完整規格http://www.1and1.com/ServerPremiumXL?__lf=Static&linkOrigin=ServerPremium&linkId=ct.btn.package.xl我訂購了 XL6 伺服器。

我不會靜態地提供圖像,因為它們儲存在伺服器的其他位置。它們在每次呼叫時使用 readfile() 動態載入。伺服器最近一直在跳動,我想知道如何優化伺服器以輕鬆處理這種流量。

我已經安裝了 eaccelerator 這似乎有幫助,但還不夠。我也曾經安裝過 X-SendFile,這似乎也有幫助,但由於 Apache 的問題,我不得不暫時將其刪除,儘管我想嘗試重新啟用它。

我基本上是在這裡尋求建議,這樣我就可以改進我的伺服器以每秒輕鬆處理 50 個請求(除非這完全不合理)。我自己是一名開發人員,雖然我知道基礎知識,但對 linux/apache 不太了解。我也願意學習。感謝您提供任何資訊。

您可以在這裡做很多事情。一方面,您提到您使用 readfile() 提供圖像?這可能是罪魁禍首,因為提供圖像的是 PHP。這本質上並不比為它們提供靜態服務慢很多,並且確實帶來了多種好處(如動態圖像處理),但結果可能會遇到許多陷阱。從伺服器的角度來看,將圖像作為靜態圖像提供總是要快得多。

首先,您的腳本(返回圖像的腳本)是否推出了正確的標題?也就是說,您是否發送了告訴使用者代理記憶體圖像的 Cache-control 和 Expires 標頭?您的流量可能來自您的圖像始終或過於頻繁地提供的事實。還發送一個 Last-modified 標頭。

如果使用者代理請求文件並且您知道自使用者代理提供的日期以來該文件未被修改,您也可以發送未修改的標頭作為響應。

如果您已經設置了所有正確的標頭並確保使用者代理不會無用地請求他們已經擁有的數據,那麼您的問題出在您的 Web 伺服器上。您是否進行了任何性能測試以查看這是否僅影響圖像或是否影響所有請求?

我建議嘗試查看您的伺服器在處理正常(PHP)請求時有多強大。查看您的頁面本身需要多長時間,並將其與圖像請求進行比較。為此,我建議使用Pylot 之類的好工具(它是命令行,但非常有用)。

(請注意,為了進行比較,將 X 大小的頁面與 X 大小的圖像進行比較是很有用的,這樣頻寬相等,您可以對性能進行評分)。

編輯:

告訴使用者代理請求盡可能長時間地記憶體文件的記憶體標頭如下:

$lastModified=filemtime($myPicture); // File location of your image
$cacheDuration=31536000; // One year
// This tells user agent to keep the cache for one year
header('Cache-Control: public,max-age='.$cacheDuration);
header('Expires: '.gmdate('D, d M Y H:i:s',(time()+$cacheDuration)).' GMT');
// This tells the user agent the last modified time of your image
header('Last-Modified: '.gmdate('D, d M Y H:i:s',$lastModified).' GMT');

服務未修改的標頭有點複雜:

// Testing if the servers known last modified time is different from the last modified time of file on your server
// If those times are the same, then we will not return the image and just tell the user agent to use their cache
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])>=$lastModified){
   // Cache headers (Last modified is never sent with 304 header, since it is often ignored)
   header('Cache-Control: public,max-age='.$cacheDuration);
   header('Expires: '.gmdate('D, d M Y H:i:s',(time()+$cacheDuration)).' GMT');
   // Returning 304 header
   header('HTTP/1.1 304 Not Modified');
   die();
}

引用自:https://serverfault.com/questions/385278