भारी भार के लिए VPS पर चल रहे अपाचे / php / mysql को ऑप्टिमाइज़ करें


17

512 m RAM के साथ VPS पर अपाचे / mysql सर्वर के अनुकूलन के बारे में प्रश्न। सामान्य भार के तहत सब कुछ तेजी से चलता है, कोई कनेक्शन नहीं है। हालाँकि जब हमें अपने भारी ट्रैफ़िक के दिन (50k + विज़िट) मिलते हैं तो साइट क्रॉल हो जाती है और एपाचे से सामग्री वापस पाने में 30 सेकंड + लगते हैं।

साइट एक्सप्रेशन इंजन (CMS) (PHP में) पर चल रही है और मैंने उनके भारी-भरकम अनुकूलन गाइड का अनुसरण किया है। मैंने गुगली की है और कुछ भाग्य के साथ अपाचे के लिए काफी कुछ का पालन किया है, जहां यह अभी है, लेकिन मुझे लगातार प्रतिक्रिया समय प्राप्त करने की आवश्यकता है।

मुझे लगता है कि यह 'कम मेमोरी के लिए ऑप्टिमाइज़' प्रश्न से अलग है, क्योंकि मेरे पास पर्याप्त रैम है (मैं जो करने की कोशिश कर रहा हूं), मुझे बस सर्वर को भारी लोड के तहत चोक नहीं करने की आवश्यकता है।

कोई सिफारिश?


1
बस एक फॉलोअप - लाइटटैप पर स्विच किया गया और पहले से ही अंतर आश्चर्यजनक है, लोड को बेहतर तरीके से संभालना। आने के लिए अधिक अनुकूलन मुझे यकीन है, लेकिन इससे बहुत मदद मिली। और, मैं ईकेलरेटर का उपयोग कर रहा था, जिसे मैंने एपीसी पर उठाया था, क्योंकि यह पूछा गया था।
तोते

जवाबों:


18

PHP के लिए 2 महत्वपूर्ण चीजें हैं जो क्षमता बढ़ाएगी:

  1. जैसा कि उल्लेख किया गया था उन्नत PHP कैशिंग (APC)। यह वही है जो हम याहू में उपयोग करते हैं!। इसी तरह की अन्य परियोजनाएं भी हैं, लेकिन यह रासमस का बच्चा है।
  2. Mod_php के बजाय FastCGI । इस मुद्दे पर बहस चल रही है क्योंकि mod_php आमतौर पर सबसे तेज है। हालाँकि, मुझे लगता है कि आपके पास एक एकल अपाचे सर्वर है जो गतिशील PHP सामग्री और स्थिर संपत्ति (जेएस, सीएसएस, फ्लैश, चित्र, पीडीएफ, आदि) दोनों को वितरित करता है। उन स्थिर संपत्ति के अनुरोधों को अधिक मेमोरी का उपभोग करने की आवश्यकता नहीं है, लेकिन क्योंकि पीएचपी एक मॉड्यूल है यह हर अपाचे धागे में है।

अपाचे के लिए:

  1. कार्यकर्ता एमपीएम का उपयोग करें
  2. KeepAlive को सक्षम करें

आप इतनी दूर भी जा सकते हैं कि अपाचे से लाइटटैप , या नेग्नेक्स पर स्विच करने पर विचार करें । मुझे अपाचे से प्यार है। मैं इसमें से कई उन्नत सुविधाओं से मूर्ख का उपयोग करता हूं। मैं इसके ओवरहेड को स्वीकार करता हूं क्योंकि मुझे इसकी आवश्यकता है। आम LAMP स्टैक के लिए, यह जरूरत से ज्यादा और संसाधनों की बर्बादी है।

MySQL के लिए:

  1. जब आपके my.cnf मानों को बदलने के बजाय विश्लेषण और सुधारों को सही करने के लिए आपका अनुकूलन प्रयास 10 गुना भुगतान करेगा। मैं यह नहीं कह रहा हूं कि आपके कैशिंग, कनेक्शन आदि को सही करना महत्वपूर्ण नहीं है ... लेकिन ज्यादातर लोगों के लिए यह समस्या का केवल 9% है।
  2. अपने QA के दौरान, भेजे गए सभी प्रश्नों को पकड़ने के लिए अपने मंचन / देव myqqld पर सामान्य क्वेरी लॉग ऑन करें। (अपने उत्पादन mysql सर्वर पर ऐसा मत करो!)
  3. प्रश्नों का विश्लेषण करने के लिए EXPLAIN का उपयोग करें । खासकर यदि आप ORM के साथ एक फ्रेमवर्क का उपयोग कर रहे हैं (DB को दूर कर देता है और आपको अपनी एसक्यूएल लिखने से रोकता है) तो आपको बाहरी जोइनों को साफ करने की आवश्यकता होगी, जहां कोई क्लॉज नहीं है, वहां ORDER BYs 'फाइलसॉर्ट का उपयोग करके' और प्रश्नों का चयन करें। कि कोई सूचकांक का उपयोग करें।
  4. यदि आप MySQL 5.1 का उपयोग कर रहे हैं तो क्वेरी प्रोफाइलर का लाभ उठाएं

विचार करने लायक अन्य उपकरण एमके-दृश्य-व्याख्या हैं

मैंने 10 महान संदर्भों का हवाला दिया है। ये बातें आपको गुनगुनाती हैं। कृपया हमें बताएं कि यह कैसे निकला।


6

अपनी PHP सत्र फ़ाइलों को एक tmpfs में ले जाएं , APC (या अन्य) का उपयोग करें और उन सभी PHP मॉड्यूल को हटा दें जिनकी आपको आवश्यकता नहीं है। उन सभी अपाचे मॉड्यूल को हटा दें जिनकी आपको आवश्यकता / उपयोग नहीं है।

एक tmpfs बनाने के लिए (RAM में एक निर्देशिका!)

mkdir /tmpfs; chmod 777 /tmpfs
mount -t tmpfs -o size=256M tmpfs /tmpfs

In / etc / fstab रिबूट पर बनाने के लिए नीचे की लाइन जोड़ें!

tmpfs     /tmpfs    tmpfs   size=256m,mode=0777    0       0

में /etc/apache2/php.ini रैम (tmpfs) में अपने सत्र स्टोर करने के लिए समायोजित करें!

session.save_handler = files
session.save_path = "/tmpfs"

नोट: अपनी PHP फ़ाइलों और सत्र फ़ाइलों के साथ RAM में आप मुश्किल से डिस्क को छूते हैं!

Apache_module का उपयोग अपाचे में करें ताकि ब्राउज़र अधिकांश चीजों को कैश कर देगा।

ExpiresActive On
ExpiresDefault "access plus 90 days"
ExpiresByType image/gif "access plus 90 days"
ExpiresByType image/ico "access plus 90 days"
ExpiresByType image/png "access plus 90 days"
ExpiresByType image/jpeg "access plus 90 days"
ExpiresByType image/x-icon "access plus 90 days"
ExpiresByType text/css "Access plus 90 days"
ExpiresByType text/html "Access plus 90 days"
ExpiresByType application/x-shockwave-flash "Access plus 90 days"
ExpiresByType application/x-javascript "Access plus 90 days"

.Htaccess फ़ाइलों का उपयोग न करें ! इसके बजाय, हार्ड कोड उन्हें vhost config फाइल में! सभी http अनुरोधों के अनुसार डिस्क चेक को अत्यधिक रूप से समाप्त / कम करेगा ... यह वास्तव में जोड़ता है।

Options FollowSymLinks 
AllowOverride None

आपके vhost.conf फ़ाइल में प्रयुक्त .htaccess का उदाहरण ...

<Directory /home/user/www/site.com/secure>
    Order Allow,Deny
    Deny from All
</Directory>

5

कुछ बातें दिमाग में आती हैं।

ओपकोड कैश हमेशा एक अच्छा विचार है। मुझे APC पर http://eaccelerator.net/ अधिक पसंद है । यदि आप एपीसी के साथ विकास नहीं कर रहे हैं तो जिस तरह से इसे जोड़ने की कोशिश की जा रही है वह लगभग हमेशा दर्दनाक है। Eaccelerator जबकि फैंसी के रूप में काम करने के लिए नहीं लगता है।

एक रिवर्स प्रॉक्सी भी एक अच्छा विचार है, लेकिन आपको रैम का उपयोग करने की आवश्यकता है। मैं अपाचे 2.2 को mpm- कार्यकर्ता के साथ राम पर उचित मात्रा में लेने के लिए पाता हूं। आपके मामले में मैं Nginx की तरह कुछ हल्का करने की सलाह दूंगा और FASTCGI के रूप में PHP के साथ Apache चलाऊं या बस इसे प्रक्रिया के अनुसार छोड़ दूं। वार्निश, स्क्विड, नेग्नेक्स, आदि का उपयोग करने के साथ विचार उन्हें स्थैतिक सामग्री की सेवा करने, उपयोगकर्ता कनेक्शन से निपटने और केवल अपाचे के लिए PHP अनुरोधों को पारित करने के लिए है जो आप एक एप्लिकेशन सर्वर के रूप में मानते हैं।

यदि आप मैसकल 5.1 का काफी हालिया संस्करण चला रहे हैं, तो कम से कम 5.1.24 की तरह अब आपके पास उप सेकंड धीमी लॉग्स तक पहुंच है। मैं 1 या 2 पर long_query_time शुरू करूंगा और फिर इसे 0.5 तक नीचे लाऊंगा क्योंकि आपको वास्तव में लंबे लोगों पर एक हैंडल मिलता है। मैसकल के लिए नेट पर बहुत सारी सामान्य ट्यूनिंग जानकारी भी है, लेकिन आपके पास बहुत कुछ करने के लिए रैम नहीं है। क्या आपने डिफ़ॉल्ट रूप से किसी सेटिंग को बढ़ाया है? अधिकांश डिफ़ॉल्ट my.cnf फाइलें लगभग 64MB RAM का उपयोग करने के लिए कॉन्फ़िगर की गई हैं। यह बहुत ही कम से कम मैं 16_ से 64MB तक key_buffer जुटाऊंगा।

इसके अतिरिक्त आप Myisam या Innodb तालिकाओं का उपयोग कर रहे हैं? यदि आप DB में सत्र रख रहे हैं, तो आप सत्र तालिका को Innodb में बदलना चाहते हैं (या इसके बजाय इसे कुकी बना सकते हैं) बजाय इसे एक मैसियम तालिका छोड़ दें जो पंक्ति स्तर लॉकिंग के बजाय तालिका स्तर लॉकिंग करता है। मूल रूप से कोई भी तालिका जो 20% से अधिक 80% तक लिखी जाती है वह इनोडब में जाने के लिए एक उम्मीदवार है। याद रखें कि आपको Myisam तालिकाओं और Innodb तालिकाओं के बीच RAM की मात्रा को संतुलित करना होगा क्योंकि प्रत्येक के लिए बफ़र्स अलग से कॉन्फ़िगर किए गए हैं।

और अंत में एक और 512MB RAM आपके सेटअप में एक लंबा रास्ता तय करेगा या एक और 512MB VPS में मैसकल चलाने के लिए अगर यह सस्ता है या मोटे तौर पर एक ही कीमत है। मैं वास्तव में एक दूसरे उदाहरण की ओर झुकूंगा क्योंकि वह उपलब्ध डिस्क IO को दोगुना कर देगा। VPS सर्वरों में से एक समस्या यह है कि आपका IO उसी भौतिक सर्वर पर अन्य लोगों से सुरक्षित नहीं है।

हम्म मेरी पोस्ट सभी छंटनी बिखरी हुई है, लेकिन आपको देखने के लिए बहुत सारे स्थान प्रदान करती है। सौभाग्य।


2
  • एपीसी की तरह php के लिए एक opcode कैश का उपयोग करें।
  • स्क्वीड या वार्निश जैसे http एक्सेलरेटर का उपयोग करें।

1

कम मेमोरी की स्थिति में (512Mb कम है, एक उच्च-ट्रैफ़िक सर्वर के लिए) यह वेब सर्वर और DB इंजन की आपकी पसंद पर विचार करने योग्य है।

लाइटटैप बॉक्स से हल्का होता है। अपाचे की तुलना में आमतौर पर इसे बहुत अधिक ट्विक करने के बाद बनाया जा सकता है, और इससे हल्का विकल्प भी होता है। यह निश्चित रूप से संभव नहीं है अगर वहाँ Apache विशेषताएँ हैं जो आप उस पर निर्भर करते हैं जो अन्य सर्वरों में समर्थन नहीं करते हैं।

Myl की तुलना में sqlite बहुत तंग है, और कई परिस्थितियों में तेज़ भी है। जांचें कि क्या आप जिस इंजन का उपयोग कर रहे हैं, वह इसके साथ-साथ समर्थन करता है या नहीं और यदि यह कोशिश करता है।

अन्य विकल्प, आसान विकल्प, वीएम में अधिक रैम प्राप्त करना है यदि आप इसे खरीद सकते हैं।


1

यहाँ महान सुझावों से परे, यह ध्यान दिया जाना चाहिए कि सभी VPS 'समान नहीं बनाए गए हैं। मेरे अनुभव में पीएचपी सीपीयू के भारी होने के कारण निकला।

EC2 पर nginx / apc / phpfpm / mysql (स्थानीय) का एक Wordpress AB बेंचमार्क (ab -n 500 -c 25 http://domain.com/index.php ) EC2 पर ~ 2 अनुरोध / दूसरा उनके प्रवेश स्तर पर परिणाम "2GB RAM / 1 कंप्यूट यूनिट सर्वर ”।

512MB Rackspace Cloudserver रिटर्न ~ 80 req / second पर समान बेंच स्टैक (समान ओएस पर स्क्रिप्ट द्वारा तैनात) के खिलाफ एक ही बेंचमार्क चलता है। तो 4x कम रैम, इस अल्पविकसित प्रयोग में 40x प्रदर्शन।

AB के दौरान शीर्ष पर जाकर आप देखते हैं कि EC2 बस संगामिति को संभाल नहीं सकता है, और तुरंत 100% CPU लोड और लॉक अप को हिट करेगा। 512MB सर्वर (वर्चुअलाइज्ड क्वाड कोर सीपीयू) पर शीर्ष बेंचमार्क को देखते हुए, कोर 60% लोड और सुचारू रूप से बेंचमार्क को हिट करेगा।

वीपीएस को स्पिन करना बेहद आसान है और बिना किसी प्रतिबद्धता के बंद हो जाता है, यह आपके वीएम / वीपीएस के बुनियादी ढांचे को परीक्षण में रखने के लिए चोट नहीं पहुंचाता है!

EDIT 1: इसके अलावा, EC2 का "हाई सीपीयू" स्मॉल इंस्टेंस केवल ~ 10 / req सेकेंड तक ही सक्षम था, सीपीयू अभी भी अड़चन है। मेरा निष्कर्ष यह था कि आप EC2 के साथ स्थिरता / मजबूती के लिए प्रदर्शन का त्याग करते हैं, और निश्चित रूप से ऐसे कई उपयोग-मामले हैं जो ऐसे वातावरण के लिए कहते हैं।


भी, nginx (v.1 आज जारी) पर विचार करें। wordpress.com ने अपने litespeed कॉन्फ़िगरेशन को nginx के साथ स्वैप किया ताकि यह स्पष्ट रूप से एक सक्षम वेबसर्वर है।
इनेल्बेक

Nginx वास्तव में प्रभावशाली है। मैं यही चाहता हूं कि यह .htaccess फ़ाइलों से mod_rewrite नियमों को पढ़ सके।
मार्टिज़न हेमेल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.