एक यूनिक्स वेबसर्वर पर मेमोरी का उपयोग कैसे कम करें


36

मैं वर्तमान में अपने वेबएप को होस्ट करने के लिए एक जॉयंट एक्सेलेरेटर का उपयोग कर रहा हूं, और यह ठीक काम कर रहा है, हालांकि मुझे लागत कम करने की आवश्यकता है इसलिए मैं अपनी वर्तमान योजना को अपग्रेड कर रहा हूं और इससे कुछ नई मेमोरी सीमाएं (256M rss, 512M स्वैप) हो जाती हैं। मैं कल भी उन पर बहुत दूर नहीं था, लेकिन आज कई बार अपाचे को फिर से शुरू करने के बाद, मैं अब 411M आरएसएस, 721 एम स्वैप (prstat -Z -s cpu) कर रहा हूं।

सर्वर फाल्ट में खोज करने से मुझे सर्वर पर नजर रखने के लिए बहुत सारे तरीके और विशिष्ट उपकरण मिलते हैं, लेकिन यह कैसे उपयोग को कम करने / अनुकूलित करने के बारे में कोई सलाह नहीं है। मैंने भी यह प्रश्न देखा है , लेकिन मुझे नहीं लगता कि यह इस विशेष के लिए अच्छा है (या मैं सामान्य कह सकता हूं?) स्थिति।

सर्वर एक साझा CPU पर Solaris चला रहा है, और मैं Apache + MySQL + PHP स्टैक का उपयोग कर रहा हूं।

मैं उन चरणों को जानने में दिलचस्पी रखता हूं जो इस समस्या का निवारण कर सकते हैं और मुद्दों को हल कर सकते हैं। हालाँकि, मैं अपनी मेमोरी फ़ुट प्रिंट को कम करने और वर्तमान समाप्त होने से पहले योजना को डाउनग्रेड करने के लिए समय से बाहर चल रहा हूं, इसलिए कुछ भी जो जादू कर सकता है और दिन को बचाने के लिए स्वागत है :)


1
मैं सिर्फ यह टिप्पणी करना चाहता था कि हालाँकि मैंने इन सेटिंग्स के बारे में खुद ही जाना था, लेकिन यह पता चला कि मैं एक फाइल में सेटिंग्स बदल रहा था, लेकिन बाद में लोड की जा रही एक अलग विन्यास फाइल वास्तव में चुपचाप मेरी सेटिंग्स को ओवरराइड कर रही थी! एक बार जब मुझे पता चला कि, प्रीफ़ॉर्क एमपीएम सेटिंग्स और कुछ अन्य चीजों को सेट करना, प्रक्रिया की गिनती और स्मृति उपयोग को नियंत्रण में रखने के लिए अद्भुत काम करता है, तो न्यूनतम पर स्वैप करना। आशा है कि यह जानकारी दूसरों को, विशेष रूप से उन लोगों को अपने सर्वर पर Gentoo चलाने में मदद करती है।
पिस्तोस

जवाबों:


23

जवाबों के लिए आप सबका धन्यवाद! आपके सुझावों के बाद मैं अपने मेमोरी का उपयोग 195M SWAP और 108M RSS के लिए कर रहा हूं, बिना मेरे कोड को छूने के (मैं इसे जल्द ही ऑप्टिमाइज़ करूंगा, लेकिन यह मुझे तेजी से मुसीबत से निकालने के लिए एक समाधान माना जाता था)।

यहां उन चीजों की सूची दी गई है जो मैंने की थीं:

VirtualHost प्रविष्टियों में प्रयुक्त वाइल्डकार्ड से छुटकारा पा लिया। *: 80 और *: 443 के बजाय, मैंने अपने सर्वर के वास्तविक आईपी का उपयोग किया।

अपाचे के पूर्व-एमपीएम को बदल दिया। ये मूल्य हैं जिनका मैंने उपयोग किया है:

StartServers 1
MinSpareServers 1 
मैक्सस्पेरसर्वर्स 5 
ServerLimit 16
अधिकतम ग्राहक 16
MaxRequestsPerChild 0
सुनबाकलोग 100

ये किसी भी तरह से जादुई संख्या नहीं हैं। मैंने कुछ समय विभिन्न मूल्यों और संयोजन की कोशिश करने में बिताया है, और फिर उन्हें अपने सर्वर के वास्तविक उपयोग के खिलाफ परीक्षण कर रहा है और हर किसी को अपने संवर्धन में ऐसा ही करना चाहिए। रिकॉर्ड के लिए, मेरा सर्वर 2M pv / महीने के करीब प्राप्त करता है, दोनों नियमित पृष्ठ और परिसंपत्तियों की नियमित दर से सेवा करता है - कोई डिग प्रभाव नहीं। इरादा, फिर से, स्मृति पदचिह्न को कम करने के लिए था, प्रदर्शन या हा में सुधार करने के लिए नहीं।

संदर्भ:

Apache की KeepAlive को ट्यून किया। KeepAliveTimeoutकम मूल्य (मेरे मामले में 2) पर सेट करके मैं निष्क्रिय सर्वर के साथ कनेक्शन पर प्रतीक्षा कर रहे कम सर्वर प्रक्रियाओं की अपेक्षा कर सकता हूं जो अधिक सामग्री का अनुरोध नहीं कर सकते हैं।

संदर्भ: http://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout

MySQL के अप्रयुक्त मॉड्यूल को हटा दिया। मैंने skip-innodbMySQL के my.cnf में जोड़ा । बड़े पैमाने पर स्मृति की खपत में कमी।


कुछ उल्लेखनीय अच्छे सुझाव भी हैं जो मैं व्यक्तिगत रूप से नहीं कर सका:

  • उन PHP मॉड्यूल को निकालें जिनकी आपको आवश्यकता नहीं है। मेरे सर्वर के PHP में पहले से संकलित अधिकांश मॉड हैं, मैं शायद दूसरे वीपीएस पर अपना न्यूनतम PHP आज़माऊंगा।
  • Php-fastcgi के साथ nginx पर स्विच करें। यह एक और अच्छी सलाह है जो मैं जल्द ही कोशिश करूंगा, लेकिन अभी मैं डाउनटाइम को जोखिम में नहीं डाल सकता हूं।

मैं nginx और php-fastcgi (LEMP) चला रहा हूं और समान मेमोरी के मुद्दों में चल रहा हूं ... 256MB सर्वर पर मुझे पता चलता है कि php-fastcgi PHP_FCGI_CHILDREN = 5 और PHP_FCGI_MAX_REQUESTS = 333 के साथ अच्छा काम करता है ... ये मान एक अच्छी शुरुआत हैं। बिंदु!
किसान बाग

Got rid of the wildcard used in VirtualHost entriesक्या यह वास्तव में किसी भी सार्थक तरीके से मदद करता है? मैं इस धारणा के तहत था कि इससे कोई फर्क नहीं पड़ेगा।
महन

@ मेन - यह मेमोरी के साथ मदद नहीं करता है, लेकिन यह सीपीयू के उपयोग में सुधार करता है, जो कि कम मेमोरी वाले वातावरण में एक अच्छी बात है
jsnfwlr

"Php-fastcgi के साथ nginx पर स्विच करें" --- यदि आप Apache2 रखना चाहते हैं तो एक कम कठोर अभी तक प्रभावी विकल्प होगा: Apache2 + mod_proxy_fcgi + mod_mpm_event। mpm_event nginx के समान है। Php-fpm से कनेक्ट करने के लिए इसका उपयोग करें। देखें dra बालकनी.org
जेम्स जॉनसन

6

मुझे यह लेख Apache और MySQL के लिए कम-मेमोरी कॉन्फ़िगरेशन पर मिला

कम मेमोरी कॉन्फ़िगरेशन के लिए आवश्यक कॉन्फ़िगरेशन परिवर्तन को पूरा करने में बहुत उपयोगी होना। मैंने उन्हें अपनी स्थिति के लिए ट्विक किया लेकिन उन्हें आपको अपने पर्यावरण के लिए सबसे उपयुक्त खोजने के लिए आवश्यक उपकरण देना चाहिए


लिंक मर चुका है
user2682863

4

आपको अपाचे सर्वर प्रक्रियाओं को चलाने की सीमा को सीमित करने की आवश्यकता है, और आप जितनी सीमा के करीब हैं, आप उतने अधिक ट्रैफिक वाले ट्रैफिक को संभालने में सक्षम नहीं हैं। एक वेब सर्वर का होना जो सामान्य उपयोग के तहत अधिकतम होता है, आमतौर पर एक खराब आइडिया (टीएम) होता है, क्योंकि वेब ट्रैफ़िक सबसे अधिक भाग के लिए अच्छा और निम्न होता है जब तक कि आपको स्लैशडॉट या खुदाई या आग का गोला या जो भी हो।

मुख्य मुद्दे अपाचे प्रक्रियाओं की संख्या है जो किसी भी एक बिंदु पर चल रहे हैं - यहां पूर्वनिर्मित मानकर, क्योंकि मैंने केवल PHP अनुप्रयोगों को तैनात किया है और पीएचपी थ्रेडसेफ़ नहीं है। मेरे पास कार्यकर्ता एमपीएम को आयाम देने का अनुभव नहीं है। कुछ आइटम हैं जो साझा मेमोरी में हैं, और कुछ आइटम जो प्रत्येक प्रक्रिया की मेमोरी में हैं।

आप साझा किए गए मॉड्यूल को छोड़ कर कुल मेमोरी फ़ुटप्रिंट को कम कर सकते हैं जिनकी आपको आवश्यकता नहीं है। मूल रूप से, अपाचे सूरज के नीचे सब कुछ करने के लिए अधिकांश मेजबानों से कॉन्फ़िगर किया गया है। यदि आप mod_userdir का उपयोग नहीं कर रहे हैं, तो इसे अपने अपाचे कॉन्फ़िगरेशन से बाहर टिप्पणी करें। बस सावधान रहें कि आप कितना हटाते हैं, क्योंकि कुछ चीजें जिनकी आपको ज़रूरत हो सकती है या उनकी निर्भरता सहज नहीं है! सभी मॉड्यूल को apache.org वेबसाइट पर प्रलेखित किया जाना चाहिए। प्रति प्रक्रिया पदचिह्न छोटे होने के लिए कठिन है; इन दिनों में अधिकांश अपाचे कॉन्फ़िगरेशन केवल संकलित किए गए चार आवश्यक मॉड्यूल के साथ आते हैं। उन चार मॉड्यूलों के अलावा, अधिकांश मेमोरी का उपयोग या तो लीक या एप्लिकेशन रैम से होता है जो कि प्रभावी ढंग से एकत्र नहीं किया जाता है, यही वजह है कि आप अनुरोधों की संख्या निर्धारित करना चाहते हैं प्रत्येक प्रक्रिया कम द्वारा नियंत्रित किया जाता है।

आप वास्तव में अपने मेमोरी उपयोग को रैम में ही रखना चाहते हैं और स्वैप में नहीं जाना चाहते हैं। स्वैप का मतलब I / O है। I / O धीमा है और आपके CPU उपयोग को छत के माध्यम से प्रक्रियाओं के रूप में ब्लॉक करेगा, जबकि स्वैप से बाहर निकलने के लिए कुछ का इंतजार करना होगा।


1
सलाह के लिए धन्यवाद कार्ल! क्या सर्वर को स्वैप का उपयोग करने से रोकने का कोई तरीका है? क्योंकि मेमोरी उपयोग को कम करने के बाद, मैं अब अपनी रैम पर नहीं हूं, लेकिन यह अभी भी दिखा रहा है कि SWAP मेमोरी का उपयोग किया गया है।
लीमा

@fandelost यह वास्तव में मायने नहीं रखता है कि स्वैप का उपयोग किया जा रहा है, यह तब है जब चीजें खराब हो रही हैं और स्वैप से बाहर हैं। आपका ऑपरेटिंग सिस्टम उन प्रक्रियाओं से निर्देश या डेटा को स्वैप कर सकता है जो बहुत बार नहीं चल रहे हैं जब ऐसा करने का समय है क्योंकि यह सोचता है (और अक्सर सही है) कि उन निर्देशों और डेटा वहां से बेहतर हैं।
पैट्रिक जेम्स मैकडॉगल

2

अपाचे के लिए, उन मॉड्यूल को हटा दें जिनका आप उपयोग नहीं करते हैं, क्योंकि वे सिर्फ अतिरिक्त मेमोरी का उपयोग करते हैं। MySQL के लिए, यदि आप उनका उपयोग नहीं करते हैं, तो innodb / bbdb को हटा दें और उन PHP मॉड्यूल को हटा दें जिनकी आपको आवश्यकता नहीं है।

आगे आपको एक प्रक्रिया के आकार के आधार पर अपाचे मैक्सक्लिअर्स को कॉन्फ़िगर करना चाहिए और स्मृति की मात्रा जिसे आप अपाचे देना चाहते हैं। वही MySQL पर अधिकतम कनेक्शन के लिए जाता है (मैं उत्कृष्ट MySQL ट्यूनिंग प्राइमर स्क्रिप्ट की सिफारिश करता हूं ।

यदि आपका अपने PHP ऐप पर नियंत्रण है, तो सुनिश्चित करें कि यह बहुत अधिक मेमोरी (उदाहरण के लिए, विशेष रूप से स्थिर वाले) का उपयोग नहीं करता है।

यदि आप आगे जाना चाहते हैं, तो आप अपाचे + mod_php को nginx + fcgi सेटअप के साथ बदल सकते हैं, जिसके परिणामस्वरूप संभवतः आगे की मेमोरी में कमी आएगी।

एक आखिरी बात - आप वास्तव में एक वेब सर्वर पर स्वैप नहीं करना चाहते हैं। अनावश्यक सामान को हटाने के लिए बस थोड़ा सा, लेकिन एक वेब सर्वर पर नियमित रूप से स्वैप करने के परिणामस्वरूप एक गैर-उत्तरदायी वेब साइट होगी।


आपकी सलाह के लिए धन्यवाद yhager, मैं ट्यूनिंग-primer.sh कोशिश कर रहा हूं, लेकिन मुझे निम्न त्रुटि मिलती है: "पंक्ति 94 पर वाक्य रचना त्रुटि:` cnf_socket = $ 'अनपेक्षित "। कोई विचार?
लीमा

खोल से संबंधित हो सकता है। जैसा कि यह स्क्रिप्ट संभवतः लिनक्स से संबंधित है, बैश को इंगित करने के लिए / बिन / श के बजाय पहली पंक्ति को बदलने का प्रयास करें। मुझे आशा है कि आप सोलारिस पर बैश स्थापित कर सकते हैं, लेकिन मैं उस के साथ मदद नहीं कर सकता ...
येजर

2

चूँकि आप पहले से ही अपने लक्ष्य को पूरा कर चुके हैं, यहाँ कुछ अतिरिक्त हैं:

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

और एक अन्य यह है कि आप php.ini में उपलब्ध मेमोरी की मात्रा को सीमित कर सकते हैं: memory_limit = xxxM


0

आप निश्चित रूप से प्रक्रियाओं की संख्या को सीमित कर सकते हैं अपाचे कांटा कर सकते हैं, हालांकि यह केवल आपके मेमोरी उपयोग पर एक sudo- हार्ड सीमा के रूप में काम करेगा। निचले स्तर के दृष्टिकोण से आप किसी प्रक्रिया के लिए उपलब्ध संसाधनों को प्रतिबंधित करने के लिए परिमित का उपयोग कर सकते हैं । मुझे विश्वास है कि मूल और बच्चे प्रक्रियाओं के लिए यह लागू करें।

हालांकि वेब सर्वर कॉन्फ़िगरेशन बिंदु से यह नीचे आ सकता है कि आपका कोड वास्तव में कैसे चलता है! लेकिन छोटी चीज़ों को ध्यान में रखें जैसे कि .htaccess फाइलें केंद्रीय अपाचे कॉन्फ़िगरेशन फ़ाइलों का उपयोग करने की तुलना में अधिक संसाधनों का उपयोग करती हैं (जैसा कि वे पढ़ते हैं जब भी हर बार एक अनुरोध आता है, जो अधिक उपरि के लिए अग्रणी होता है), कुछ जो बड़ी वेब साइटों में हस्ताक्षर है।


0

एक चीज जो समय के साथ मेमोरी बढ़ाने में मदद कर सकती है वह है httpd की रखवाली कम करना।


0

सर्वर एक साझा CPU पर Solaris चला रहा है, और मैं Apache + MySQL + PHP स्टैक का उपयोग कर रहा हूं।

मेरे पास सोलारिस के साथ अनुभव नहीं है, लेकिन सबसे अच्छी बात यह है कि आप Apache / mod_php का उपयोग नहीं कर सकते हैं।

  • Php-fastcgi के साथ nginx पर स्विच करें।
  • प्लगइन्स की न्यूनतम मात्रा का उपयोग करने के लिए पुनरावर्ती php।
  • Ntpd (ntpdate का उपयोग करें), ftp (उपयोग scp) आदि जैसी अनावश्यक प्रक्रियाओं से छुटकारा पाएं ...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.