Score:0

PHP5 ถึง PHP7 เพิ่มขึ้นอย่างไม่คาดคิดในการใช้งานหน่วยความจำภายในคอนเทนเนอร์

ธง ug

เมื่อสัปดาห์ที่แล้วเราได้อัปเดตเว็บไซต์ WordPress หลายแห่งที่ใช้ Alpine Linux เป็นคอนเทนเนอร์ภายในโฮสต์ (Ubuntu 20.04) ผ่าน LXD

สรุปการอัปเดตมีดังนี้:

อัลไพน์ลินุกซ์ v3.8 -> 3.14
PHP 5.3.6 -> 7.4.24
เวิร์ดเพรส 5.0.3 -> 5.7.3

ปัญหา

เราเริ่มมีปัญหากับประสิทธิภาพของเซิร์ฟเวอร์หลังจากการอัปเดตเหล่านั้น และเราพบว่าคอนเทนเนอร์ที่อัปเดตนั้นใช้หน่วยความจำ (หน่วยความจำภายใน) มากกว่า 3 เท่าหรือมากกว่าคอนเทนเนอร์รุ่นเก่า (ประมาณ 150MB เทียบกับ 50MB) ซึ่งทำให้เซิร์ฟเวอร์เริ่มสลับบ่อยขึ้น

ในเวอร์ชันเก่า (โดยใช้ PHP 5.3) หน่วยความจำที่ใช้โดย php.ini (กระบวนการ) เพิ่มขึ้นเมื่อหน้าถูกประมวลผล (ตามที่คาดไว้) แต่หลังจากเสร็จสิ้น หน้านั้นจะกลับสู่ปกติ กล่าวอีกนัยหนึ่ง เช่น: 10MB ---> 95MB ---> 10MB.

ในคอนเทนเนอร์ที่อัปเดต หน่วยความจำที่ใช้โดย php.ini เพิ่มขึ้นในลักษณะเดียวกัน แต่ไม่กลับไปเป็น "ปกติ": 10MB ---> 95MB ---> 95MB. และทุกครั้งที่ใช้กระบวนการใหม่ สิ่งเดียวกันก็จะเกิดขึ้น ทำให้การใช้หน่วยความจำเพิ่มขึ้นตามจำนวนของกระบวนการลูกที่มีอยู่ (ซึ่งในกรณีนี้คือ 4 ต่อไซต์)

สิ่งที่ฉันได้ลอง

  • ปรับลดเวอร์ชัน PHP เป็น 7.2.x และ 7.3.x : เหมือนกัน
  • ปรับปรุงเป็น php 8.0.11 : ปัญหาเดียวกัน
  • โดยใช้ อาปาเช่2 แทน lighttpd (ปัจจุบัน php ทำงานเป็น fcgi) : พฤติกรรมเดียวกัน
  • การอัปเดตเฉพาะ Alpine และ PHP เพื่อระบุว่า Wordpress อาจเป็นสาเหตุหรือไม่ : wordpress ไม่ใช่สาเหตุ
  • เรียกใช้ wordpress โดยไม่มีปลั๊กอิน (เพื่อทราบว่าปลั๊กอินบางตัวอาจทำให้เกิดปัญหาหรือไม่) : ไม่มีการเปลี่ยนแปลง
  • ดำเนินการวนซ้ำการต่อข้อมูลอย่างง่าย (pure php): สิ่งเดียวกัน
  • ทดสอบในเซิร์ฟเวอร์อื่นกับไซต์ wordpress อื่น: ลักษณะการทำงานเดียวกัน

อะไรคือสาเหตุที่ไม่กู้คืนหน่วยความจำ? จะแก้ไขได้อย่างไร?

อัปเดต

  • ฉันตั้งค่าที่สะอาด อัลไพน์ 3.14 คอนเทนเนอร์และทำการทดสอบ "ลูปอย่างง่าย" ในกรณีนั้น หน่วยความจำภายในจะลดลงตามที่คาดไว้ อย่างไรก็ตาม เมื่อฉันทดสอบกับเว็บไซต์ wordpress จริง ปัญหายังคงมีอยู่
  • ฉันตั้งค่าที่สะอาด อูบุนตู 20.04 คอนเทนเนอร์และทำการทดสอบแบบเดียวกัน ผลลัพธ์ก็เหมือนกันกับความสะอาด อัลไพน์ 3.14.
lr flag
ทำซ้ำ: https://stackoverflow.com/questions/39740398/i-am-facing-more-memory-consumption-in-php-7-compare-to-php-5-6
lepe avatar
ug flag
@BarnabasBusa ขออภัย ฉันไม่คิดว่ามันเกี่ยวข้องกับปัญหาของฉัน เมื่อทดสอบด้วยสคริปต์ PHP อย่างง่าย (การต่อสตริงด้วยการวนซ้ำ) จริง ๆ แล้ว PHP7 ใช้หน่วยความจำน้อยกว่าเมื่อเริ่มต้นและขณะรันการทดสอบอย่างง่าย ปัญหาคือมันไม่ได้กู้คืนหน่วยความจำหลังจากใช้งาน ฉันยังสงสัยว่ามันอาจเกี่ยวข้องกับแคชบางประเภท (เนื่องจาก opcache ถูกเปิดใช้งานโดยค่าเริ่มต้นใน PHP7) แต่โมดูล opcache ไม่ได้ติดตั้งด้วยซ้ำ และฉันได้ลองปิดการใช้งานในการตั้งค่าด้วย
lepe avatar
ug flag
รายงานข้อผิดพลาด: https://bugs.php.net/bug.php?id=81536 และที่เกี่ยวข้อง: https://bugs.php.net/bug.php?id=80108
Score:0
ธง ug

ตาม รายงานข้อบกพร่องนี้ มันไม่ใช่ข้อบกพร่องจริงๆ แต่เป็นคุณสมบัติใน PHP7+ ภายใต้ การจัดการหน่วยความจำ Zend Engine:

[email protected] : นี่เป็นพฤติกรรมที่คาดหวัง ตามคำขอปิด Zend ตัวจัดการหน่วยความจำไม่ได้ทำให้ชิ้นส่วนที่จัดสรรทั้งหมดว่าง แต่จะคงไว้ บางส่วน[1] เพื่อหลีกเลี่ยงความจำเป็นในการจัดสรรใหม่สำหรับครั้งต่อไป ขอ.

วิธีแก้ไขที่แนะนำคือโทร: gc_mem_caches(). คุณสามารถใช้ได้ auto_prepend_file และ auto_append_file คำสั่งใน php.ini เพื่อดำเนินการเสมอหากจำเป็น

อย่างไรก็ตามวิธีแก้ปัญหานั้นไม่ได้ช่วยในสถานการณ์ของฉัน ดังนั้นจึงไม่รับประกันว่าจะใช้งานได้

เนื่องจากไม่มีวิธีที่ง่ายในการเปลี่ยนแปลงพฤติกรรมนั้นในขณะนี้ ฉันพบวิธีอื่นในการแก้ปัญหาหน่วยความจำ (ควรใช้ได้กับ PHP7, PHP8):

  1. แทนที่จะใช้ php-cgi, ใช้ php-fpm
  2. ตั้งค่าการกำหนดค่า FPM เพื่อใช้กระบวนการลูกจำนวนน้อยที่สุด แต่ปล่อยให้สร้างลูกถ้าจำเป็น สำหรับสิ่งนี้ คุณสามารถใช้ ตามความต้องการ โหมดหรือ พลวัต:

/etc/php7/php-fpm.d/www.conf :

pm = ออนดีมานด์
; ปรับตามต้องการ:
pm.max_children = 10

หรือ:

pm = ไดนามิก
; ปรับตามต้องการ:
pm.max_children = 10
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 1

ความแตกต่างที่สำคัญระหว่างพวกเขาก็คือ ตามความต้องการ จะใช้หน่วยความจำน้อยลงเมื่อไม่ได้ใช้งาน แต่จะช้าลงเมื่อไคลเอนต์เชื่อมต่อ

นี่คือการเปรียบเทียบผลลัพธ์ของฉัน:

พี.เอช.พี โหมด เด็ก สูงสุด ไม่ได้ใช้งาน Mem เมมสูงสุด โหลดเวลา เวลาสูงสุด*
PHP5 ซีจี 4 4 50MB 200MB 5 วินาที 15 วินาที
PHP7 ซีจี 4 4 200MB 200MB 5 วินาที 30 วินาที
PHP7 FPM / ออนดีมานด์ 0 10 15MB 500MB 7 วินาที 10 วินาที
PHP7 FPM / ไดนามิก 1 10 25MB 500MB 6 วินาที 10 วินาที
  • Max Load Time ได้รับการทดสอบการทำงาน 50 ไคลเอ็นต์พร้อมกัน

ค่าในตารางเป็นค่าโดยประมาณและใช้เพื่อจุดประสงค์ในการอธิบายเท่านั้น (ไม่ใช่เกณฑ์มาตรฐานจริงแต่อย่างใด)

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา