ฉันแค่ต้องการนำหน้าสิ่งนี้ด้วยความจริงที่ว่าฉันยังใหม่กับผู้ดูแลระบบเซิร์ฟเวอร์ที่ทำงานในลักษณะนี้ แต่ฉันสนใจและกระตือรือร้นที่จะเรียนรู้มาก ฉันกำลังโฮสต์ไซต์ WordPress ขนาดเล็กบน Digital Ocean ซึ่งเป็นไซต์ที่ค่อนข้างใหม่และมีปริมาณการใช้งานเพียงเล็กน้อยหรือไม่มีเลย Droplet กำลังเรียกใช้ LAMP stack ทั่วไปและมีหน่วยความจำ 1GB ซึ่งจากประสบการณ์ของผมนั้นเพียงพอแล้วในอดีต เนื่องจากผมมักจะไม่ได้ใช้ปลั๊กอินจำนวนมากและใช้ธีมที่ค่อนข้างสว่าง ปลั๊กอินเดียวที่ฉันติดตั้งซึ่งฉันไม่เคยใช้มาก่อนคือ WordFence อย่างไรก็ตาม ในระหว่างการพัฒนา บางครั้งฉันได้รับข้อผิดพลาดว่า "เกิดข้อผิดพลาดในการสร้างการเชื่อมต่อกับ DB" บางครั้งไซต์จะไม่โหลดเลย และการเชื่อมต่อผ่าน SSH นั้นช้ามาก วันนี้ฉันประสบปัญหาและหลังจากแก้ไขปัญหาแล้ว ฉัน SSH เข้ามาเพื่อดูว่าฉันสามารถหาอะไรได้บ้าง ด้านล่างนี้คือสิ่งที่ฉันสามารถรวบรวมได้:

top แสดงรายการ mysql ขึ้นด้านบนอย่างต่อเนื่องเนื่องจากมีการใช้งานสูง

1724 mysql 20 0 1333488 405436 0 S 0.7 40.5 0:11.53 mysqld

grep -Ei 'oom|out of memory' /var/log/syslog

Jan 25 15:18:40 droplet kernel: [599977.961722]  oom_kill_process.cold+0xb/0x10
Jan 25 15:18:40 droplet kernel: [599977.961936] [  pid  ]   uid  tgid total_vm      rss pgtables_bytes swapents oom_score_adj name
Jan 25 15:18:40 droplet kernel: [599977.962031] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/system.slice/mysql.service,task=mysqld,pid=31337,uid=112
Jan 25 15:18:40 droplet kernel: [599977.962130] Out of memory: Killed process 31337 (mysqld) total-vm:1342776kB, anon-rss:439804kB, file-rss:0kB, shmem-rss:0kB, UID:112 pgtables:1264kB oom_score_adj:0
Jan 25 15:18:40 droplet kernel: [599978.039990] oom_reaper: reaped process 31337 (mysqld), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
Jan 25 15:26:50 droplet kernel: [600468.028506] systemd invoked oom-killer: gfp_mask=0x100cca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0
Jan 25 15:26:50 droplet kernel: [600468.028534]  oom_kill_process.cold+0xb/0x10
Jan 25 15:26:50 droplet kernel: [600468.028658] [  pid  ]   uid  tgid total_vm      rss pgtables_bytes swapents oom_score_adj name
Jan 25 15:26:50 droplet kernel: [600468.028754] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/system.slice/mysql.service,task=mysqld,pid=67924,uid=112
Jan 25 15:26:50 droplet kernel: [600468.028885] Out of memory: Killed process 67924 (mysqld) total-vm:1310584kB, anon-rss:385228kB, file-rss:0kB, shmem-rss:0kB, UID:112 pgtables:1132kB oom_score_adj:0
Jan 25 15:26:50 droplet kernel: [600468.092875] oom_reaper: reaped process 67924 (mysqld), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB

ฉันยังใหม่กับสิ่งนี้ ฉันไม่แน่ใจว่าสิ่งนี้เป็นปัญหาหรือไม่ (อาจเป็นการโจมตีบางประเภท) หรือเป็นเพียงการกำหนดค่าการติดตั้ง WordPress 1 คลิกของ Digital Ocean หรือหน่วยความจำ 1GB ไม่เพียงพออีกต่อไป ข้อมูลเชิงลึกใด ๆ ที่จะได้รับการชื่นชมอย่างมาก!

answer

ฉันไม่ใช่ผู้เชี่ยวชาญใน MySQL แต่ฉันใช้เวลาเล็กน้อยในการลดการใช้หน่วยความจำ MySQL 8.0 บนเซิร์ฟเวอร์ส่วนบุคคลที่ไม่สำคัญที่ฉันใช้ และมันทำงานได้ดี คนอื่นอาจโพสต์คำตอบที่ดีกว่า - ไปกับพวกเขามากกว่านี้

ฉันเรียกใช้เซิร์ฟเวอร์ AWS EC2 t3a.nano ที่มีอินสแตนซ์ Wordpress ห้ารายการ, MySQL 8.x., PHP 7.x และอีกสองสามอย่างที่มี RAM 512MB และการแลกเปลี่ยน 1GB ดังนั้น 1GB จึงเพียงพอสำหรับไซต์ที่มีปริมาณน้อย คุณสามารถเพิ่มพื้นที่สว็อปได้หากต้องการ ระบบปฏิบัติการของคุณจะทำเพจข้อมูลที่ไม่จำเป็น เพื่อให้กระบวนการที่ทำงานอยู่มี RAM มากขึ้น

คุณต้องกำหนดค่า MySQL เพื่อให้ทำงานโดยมีหน่วยความจำจำกัด เช่น การลดขนาด RAM บัฟเฟอร์ และการปิดสคีมาประสิทธิภาพ การลดการใช้ PHP RAM จะช่วยลดโอกาสที่หน่วยความจำจะหมดลงได้ MySQL 8.0 ยังคงใช้ RAM มากกว่า MySQL 5.6 มาก แม้ว่าผู้เชี่ยวชาญอาจลดจำนวนลงได้มากกว่าที่ฉันมี

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

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

/etc/mysql/conf.d/mysql.cnf

# global settings
performance_schema = OFF

innodb_buffer_pool_size=50M
innodb_flush_method=O_DIRECT
innodb_log_buffer_size=1048576
innodb_log_file_size=4194304
innodb_max_undo_log_size=10485760
innodb_sort_buffer_size=64K
innodb_ft_cache_size=1600000
innodb_max_undo_log_size=10485760
max_connections=20
key_buffer_size=1M

# per-thread settings
thread_stack=140K
thread_cache_size = 2
read_buffer_size=8200
read_rnd_buffer_size=8200
max_heap_table_size=16K
tmp_table_size=128K
temptable_max_ram=2097152
bulk_insert_buffer_size=0
join_buffer_size=128
net_buffer_length=1K

/etc/mysql/mysql.conf.d/mysqld.cnf

key_buffer_size         = 16M
thread_stack            = 256K

นี่คือการปรับแต่งบางอย่างที่ฉันทำกับการกำหนดค่า PHP เพื่อลดการใช้ RAM

/etc/php/7.4/fpm/pool.d/www.conf

pm.max_children = 3
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 1
pm.process_idle_timeout = 20s;
pm.max_requests = 50
php_admin_value[memory_limit] = 64M

สถิติเซิร์ฟเวอร์

นี่คือสถิติบางส่วนจากคำสั่ง 'บนสุด' ของเซิร์ฟเวอร์

โดยรวม

  • หน่วยความจำ 448MB, ฟรี 42MB, ใช้แล้ว 190MB, บัฟเฟอร์ 216MB / แคช
  • สลับ 1024, ฟรี 725MB, ใช้แล้ว 300MB

กระบวนการ

  • MySQL Virt 1459020 Res 44696 CPU 3% หน่วยความจำ 10%
  • PHP FPM 7.x Virt 223124 Res 32464 CPU 0% หน่วยความจำ 7%
  • Nginx Virt 63932 Res 7520 CPU 0% หน่วยความจำ 2%