วิธีการลดการใช้หน่วยความจำบนเว็บเซิร์ฟเวอร์ Unix


36

ขณะนี้ฉันกำลังใช้ Joyent Accelerator เพื่อโฮสต์ webapps ของฉันและมันใช้งานได้ดี แต่ฉันต้องลดค่าใช้จ่ายดังนั้นฉันจึงลดระดับแผนปัจจุบันของฉันและทำให้มีการ จำกัด หน่วยความจำใหม่ ฉันไม่ได้อยู่ไกลเกินกว่าพวกเขาเมื่อวานนี้ แต่หลังจากเริ่ม Apache หลายครั้งวันนี้ฉันตอนนี้ 411M rss แลกเปลี่ยน 721M (prstat -Z -s cpu)

การค้นหาใน Server Fault ให้ฉันได้หลายวิธีและมีเครื่องมือเฉพาะในการตรวจสอบเซิร์ฟเวอร์ แต่ไม่มีคำแนะนำในการลด / เพิ่มประสิทธิภาพการใช้หน่วยความจำ ฉันเคยเห็นคำถามนี้ด้วยเช่นกัน แต่ฉันไม่คิดว่ามันจะดีสำหรับสถานการณ์นี้

เซิร์ฟเวอร์กำลังใช้งาน Solaris บน CPU ที่ใช้ร่วมกันและฉันใช้ Apache + MySQL + PHP stack

ฉันสนใจที่จะทราบขั้นตอนที่สามารถแก้ไขปัญหานี้และแก้ไขปัญหาได้ อย่างไรก็ตามฉันยังใช้เวลาน้อยเกินไปในการลดขนาดหน่วยความจำของฉันพิมพ์และปรับลดแผนก่อนที่จะสิ้นสุดดังนั้นสิ่งใดก็ตามที่สามารถสร้างเวทมนตร์และช่วยประหยัดทั้งวันก็ยินดีเช่นกัน :)


1
ฉันแค่อยากจะแสดงความคิดเห็นว่าถึงแม้ว่าฉันได้เรียนรู้เกี่ยวกับการตั้งค่าเหล่านี้ด้วยตัวเองจาก googling แต่กลับกลายเป็นว่าฉันกำลังเปลี่ยนการตั้งค่าในไฟล์เดียว แต่ไฟล์กำหนดค่าอื่นที่ถูกโหลดในภายหลัง เมื่อฉันค้นพบแล้วว่าการตั้งค่าการตั้งค่า MPM prefork และสิ่งอื่น ๆ อีกสองสามสิ่งที่น่าประหลาดใจที่ทำให้กระบวนการนับและการใช้หน่วยความจำอยู่ภายใต้การควบคุม หวังว่าข้อมูลนี้จะช่วยผู้อื่นโดยเฉพาะผู้ที่ใช้ Gentoo บนเซิร์ฟเวอร์ของพวกเขา
Pistos

คำตอบ:


23

ขอบคุณทุกคนสำหรับคำตอบของคุณ! ทำตามคำแนะนำของคุณฉันสามารถลดการใช้งานหน่วยความจำของฉันเป็น 195M SWAP และ 108M RSS โดยไม่ต้องแตะรหัสของฉัน (ฉันจะปรับให้เหมาะสมในไม่ช้า

นี่คือรายการสิ่งที่ฉันทำ:

กำจัด wildcard ที่ใช้ในรายการ VirtualHost แทนที่จะ *: 80 และ *: 443 ฉันใช้ IP จริงของเซิร์ฟเวอร์

เปลี่ยน MPM prefork ของ Apache นี่คือค่าที่ฉันใช้ด้วย:

เริ่มเซิร์ฟเวอร์ 1
MinSpareServers 1 
MaxSpareServers 5 
ServerLimit 16
MaxClients 16
MaxRequestsPerChild 0
ListenBacklog 100

เหล่านี้เป็นตัวเลขที่ไม่มีทางวิเศษ ฉันใช้เวลาลองใช้ค่าและการผสมผสานที่แตกต่างกันแล้วทดสอบกับการใช้งานจริงของเซิร์ฟเวอร์ของฉันและทุกคนควรทำสิ่งเดียวกันในสภาพแวดล้อมของพวกเขา สำหรับบันทึกเซิร์ฟเวอร์ของฉันได้รับเกือบ 2 ล้าน pvs / เดือนให้บริการทั้งหน้าเว็บแบบไดนามิกและเนื้อหาในอัตราปกติ - ไม่มีเอฟเฟกต์ digg ความตั้งใจอีกครั้งคือลดรอยความทรงจำไม่ใช่เพื่อปรับปรุงประสิทธิภาพหรือ HA

อ้างอิง:

ติดตาม KeepAlive ของ Apache ได้ ด้วยการตั้งค่าKeepAliveTimeoutที่ต่ำกว่า (2 ในกรณีของฉัน) ฉันสามารถคาดหวังว่ากระบวนการเซิร์ฟเวอร์น้อยลงเพียงแค่รอการเชื่อมต่อกับลูกค้าที่ไม่ได้ใช้งานซึ่งอาจไม่ขอเนื้อหาเพิ่มเติมอีก

การอ้างอิง: http://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout

ลบโมดูลที่ไม่ได้ใช้ของ MySQL ออก ฉันเพิ่มskip-innodbไปยัง MySQL ของ my.cnf ลดการใช้หน่วยความจำขนาดใหญ่


นอกจากนี้ยังมีคำแนะนำดีๆที่น่าทึ่งที่ฉันไม่สามารถทำได้ด้วยตนเอง:

  • ลบโมดูล PHP ที่คุณไม่ต้องการ PHP บนเซิร์ฟเวอร์ของฉันมี mods ส่วนใหญ่ที่รวบรวมไว้แล้วฉันอาจลองใช้ PHP ขั้นต่ำของตัวเองใน VPS อื่น ๆ
  • เปลี่ยนเป็น nginx ด้วย php-fastcgi นั่นเป็นอีกคำแนะนำที่ดีที่ฉันจะลองในไม่ช้า แต่ตอนนี้ฉันไม่สามารถเสี่ยงต่อการหยุดทำงานได้

ฉันใช้งาน nginx และ php-fastcgi (LEMP) และกำลังทำงานในปัญหาหน่วยความจำที่คล้ายกัน ... บนเซิร์ฟเวอร์ 256MB ฉันพบว่า php-fastcgi ทำงานได้ดีกับ PHP_FCGI_CHILDREN = 5 และ PHP_FCGI_MAX_REQUESTS = 333 ... ค่าเหล่านี้เป็นการเริ่มต้นที่ดี จุด!
farinspace

Got rid of the wildcard used in VirtualHost entriesที่จริงช่วยในทางที่มีความหมายใด ๆ ฉันอยู่ภายใต้ความประทับใจที่จะไม่สร้างความแตกต่าง
Mahn

@Mahn - มันไม่ได้ช่วยอะไรกับหน่วยความจำ แต่มันช่วยปรับปรุงการใช้งาน CPU ซึ่งเป็นสิ่งที่ดีในสภาพแวดล้อมของหน่วยความจำต่ำ
jsnfwlr

"เปลี่ยนเป็น nginx ด้วย php-fastcgi" --- ตัวเลือกที่รุนแรงและมีประสิทธิภาพน้อยกว่าหากคุณต้องการเก็บ Apache2 ไว้: Apache2 + mod_proxy_fcgi + mod_mpm_event mpm_event คล้ายกับ nginx ใช้เพื่อเชื่อมต่อกับ php-fpm ดูdracony.org/stop-using-php-fpm-to-argue-using-nginx-vs-apache
James Johnston

6

ฉันพบบทความนี้เกี่ยวกับการกำหนดค่าหน่วยความจำต่ำสำหรับ Apache และ MySQL

มีประโยชน์มากในการจัดโครงร่างการเปลี่ยนแปลงการกำหนดค่าที่จำเป็นสำหรับการกำหนดค่าหน่วยความจำเหลือน้อย ฉัน tweaked พวกเขาสำหรับสถานการณ์ของตัวเอง แต่พวกเขาควรให้เครื่องมือที่จำเป็นในการค้นหาแบบที่ดีที่สุดสำหรับสภาพแวดล้อมของคุณ


ลิงก์ใช้งานไม่ได้
user2682863

4

คุณจะต้อง จำกัด จำนวนกระบวนการเซิร์ฟเวอร์ apache ที่กำลังทำงานอยู่และใกล้เคียงกับขีด จำกัด ที่คุณเป็นคุณจะไม่สามารถจัดการปริมาณการใช้งานที่สูงมากได้ การมีเว็บเซิร์ฟเวอร์ที่ใช้งานได้สูงสุดภายใต้การใช้งานปกตินั้นเป็นความคิดที่ไม่ดี (tm) เนื่องจากปริมาณการใช้งานเว็บนั้นดีและต่ำสำหรับส่วนใหญ่จนกว่าคุณจะได้รับ slashdotted หรือขุดหรือ fireballed หรืออะไรก็ตาม

ปัญหาหลักคือจำนวนของกระบวนการ apache ที่ทำงานที่จุดใดจุดหนึ่ง - สมมติว่า prefork ที่นี่เนื่องจากฉันได้ปรับใช้โปรแกรม PHP เท่านั้นและ PHP ไม่ได้เป็น threadsafe ฉันไม่มีประสบการณ์ในการกำหนดขนาด MPM ของผู้ปฏิบัติงาน มีบางรายการที่อยู่ในหน่วยความจำที่ใช้ร่วมกันและบางรายการที่อยู่ในหน่วยความจำของแต่ละกระบวนการ

คุณสามารถลดขนาดหน่วยความจำทั้งหมดได้โดยไม่ต้องแบ่งโมดูลที่คุณไม่ต้องการออก โดยทั่วไปแล้ว Apache มาจากโฮสต์ส่วนใหญ่ที่จะทำทุกอย่างภายใต้ดวงอาทิตย์ หากคุณไม่ได้ใช้ mod_userdir ให้คอมเม้นต์จากการกำหนดค่า apache ของคุณ แค่ระวังว่าคุณเอาออกไปมากแค่ไหนเพราะบางสิ่งที่คุณอาจต้องการหรือการพึ่งพานั้นไม่ง่ายนัก! โมดูลทั้งหมดควรได้รับการบันทึกไว้ในเว็บไซต์ apache.org รอยต่อกระบวนการนั้นยากที่จะทำให้เล็กลง การกำหนดค่า apache ส่วนใหญ่ในวันนี้มาพร้อมกับโมดูลที่จำเป็นสี่ชุดเท่านั้นนอกจากการใช้หน่วยความจำทั้งสี่ส่วนแล้วการใช้หน่วยความจำส่วนใหญ่มาจากการรั่วไหลหรือ RAM ของแอพพลิเคชั่นที่ไม่ได้เก็บขยะอย่างมีประสิทธิภาพ จัดการโดยแต่ละกระบวนการต่ำ

คุณจริงๆต้องการให้ใช้หน่วยความจำของคุณในแรมตัวเองและไม่ไปลงในการแลกเปลี่ยน Swap หมายถึง I / O I / O ช้าและจะผลักดันการใช้งาน CPU ของคุณผ่านหลังคาขณะที่กระบวนการปิดกั้นในขณะที่รอบางสิ่งบางอย่างในการสลับสับเปลี่ยน


1
ขอบคุณสำหรับคำแนะนำ Karl! มีวิธีป้องกันเซิร์ฟเวอร์จากการใช้ Swap หรือไม่? เพราะหลังจากลดการใช้หน่วยความจำฉันไม่ได้ใช้ RAM เกินอีกต่อไป แต่มันยังคงแสดงหน่วยความจำ SWAP ที่ใช้อยู่
ลิมา

@andelost มันไม่สำคัญว่าการแลกเปลี่ยนนั้นจะถูกใช้เมื่อใดก็ตามที่มีการเพจเข้าและออกจากการสลับที่ไม่ดี ระบบปฏิบัติการของคุณอาจสลับคำแนะนำหรือข้อมูลจากกระบวนการที่ไม่ได้ทำงานบ่อยครั้งเมื่อมีเวลาทำเพราะคิดว่า (และมักจะถูก) ว่าคำแนะนำและข้อมูลเหล่านั้นดีกว่า
Patrick James McDougle

2

สำหรับ apache ให้ลบโมดูลที่คุณไม่ได้ใช้เนื่องจากใช้หน่วยความจำเพิ่มเติม สำหรับ MySQL ให้ลบ innodb / bbdb หากคุณไม่ได้ใช้และลบโมดูล PHP ที่คุณไม่ต้องการ

ถัดไปคุณควรกำหนดค่า apache MaxClients ตามขนาดของหนึ่งกระบวนการและจำนวนหน่วยความจำที่คุณต้องการให้ apache ไปเหมือนกันสำหรับการเชื่อมต่อสูงสุดใน MySQL (ฉันแนะนำMySQL Primer การปรับ Primer Script ที่ยอดเยี่ยม

หากคุณมีการควบคุมแอพ PHP ของคุณตรวจสอบให้แน่ใจว่ามันไม่ได้ใช้หน่วยความจำมากเกินไป (เช่นในตัวแปรโดยเฉพาะอย่างยิ่งคงที่)

หากคุณต้องการดำเนินการต่อคุณสามารถแทนที่ apache + mod_php ด้วยการตั้งค่า nginx + fcgi ซึ่งอาจส่งผลให้การลดหน่วยความจำเพิ่มเติม

สิ่งสุดท้ายที่คุณไม่ต้องการแลกเปลี่ยนบนเว็บเซิร์ฟเวอร์ เพียงเล็กน้อยเพื่อลบสิ่งที่ไม่จำเป็นออกไป แต่การสลับเป็นประจำบนเว็บเซิร์ฟเวอร์จะทำให้เว็บไซต์ไม่ตอบสนอง


ขอบคุณสำหรับคำแนะนำของคุณ yhager ฉันกำลังลองจูน -primer.sh แต่ฉันได้รับข้อผิดพลาดต่อไปนี้: "ข้อผิดพลาดทางไวยากรณ์ที่บรรทัด 94:` cnf_socket = $ 'ไม่คาดคิด " ความคิดใด ๆ
ลิมา

อาจเกี่ยวข้องกับเชลล์ เนื่องจากสคริปต์นี้อาจเกี่ยวข้องกับ Linux ให้ลองเปลี่ยนบรรทัดแรกให้ชี้ไปที่ทุบตีแทน / bin / sh ฉันหวังว่าคุณจะได้รับการทุบตีติดตั้งบน Solaris แต่ฉันไม่สามารถช่วยเหลือได้ ...
yhager

2

เมื่อคุณบรรลุเป้าหมายเรียบร้อยแล้วต่อไปนี้เป็นสิ่งพิเศษ:

เมื่อคุณลบโมดูล php ที่ไม่จำเป็นออกไปคุณสามารถทำเช่นเดียวกันกับ Apache โดยค่าเริ่มต้น (ขึ้นอยู่กับการติดตั้งเจ้า) apache โหลดโมดูลพิเศษจำนวนมากและส่วนใหญ่ไม่จำเป็นสำหรับการใช้งานปกติในแต่ละวัน ตัวอย่างเช่นมีโมดูลการตรวจสอบเครือข่ายที่โหลดอยู่เสมอ โดยทั่วไปแล้วไม่จำเป็นต้องมีการยุบตัวเว้นแต่ว่าคุณกำลังพยายาม จำกัด การใช้แบนด์วิดท์ของคุณ Autoindex & status ก็เป็นที่น่าสงสัยเช่นกัน

และอีกอันหนึ่งคือคุณสามารถ จำกัด จำนวนหน่วยความจำที่ใช้ได้สำหรับ php ใน php.ini: memory_limit = xxxM


0

แน่นอนว่าคุณสามารถ จำกัด จำนวนกระบวนการที่ apache สามารถแยกได้ แต่สิ่งนี้จะใช้ได้เฉพาะในการ จำกัด การใช้หน่วยความจำของคุณเท่านั้น จากมุมมองระดับล่างคุณสามารถใช้plimitเพื่อ จำกัด ทรัพยากรที่มีอยู่สำหรับกระบวนการ ใช้สิ่งนี้กับกระบวนการพ่อแม่และลูกที่สืบทอดมาซึ่งฉันเชื่อ

อย่างไรก็ตามจากมุมมองการกำหนดค่าเว็บเซิร์ฟเวอร์มันสามารถลดลงได้ว่าโค้ดของคุณทำงานอย่างไร! แต่จำไว้ว่าสิ่งเล็กน้อยเช่นการใช้ไฟล์. htaccess ใช้ทรัพยากรมากกว่าการใช้ไฟล์การกำหนดค่า apache กลาง (เนื่องจากมีการอ่านทุกครั้งที่มีการร้องขอเข้ามา


0

สิ่งหนึ่งที่อาจช่วยให้การเติบโตของหน่วยความจำในช่วงเวลาหนึ่งคือการตั้งค่า httpd keepalive ที่ต่ำกว่า แต่ฉันจะทดสอบอย่างระมัดระวังในกรณีที่แอปพลิเคชันของคุณต้องการกระบวนการที่มีชีวิตที่ยาวนานกว่า


0

เซิร์ฟเวอร์กำลังใช้งาน Solaris บน CPU ที่ใช้ร่วมกันและฉันใช้ Apache + MySQL + PHP stack

ฉันไม่มีประสบการณ์กับ Solaris แต่สิ่งที่ดีที่สุดที่คุณสามารถทำได้คือไม่ใช้ Apache / mod_php

  • เปลี่ยนเป็น nginx ด้วย php-fastcgi
  • คอมไพล์ PHP ใหม่เพื่อใช้จำนวนปลั๊กอินที่น้อยที่สุด
  • กำจัดกระบวนการที่ไม่จำเป็นเช่น ntpd (ใช้ ntpdate), ftp (use scp) ฯลฯ ...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.