เว็บพอคนเข้าเยอะ ๆ ขึ้น ERROR CONNECT DATABASE บ่อยเลยครับ เพิ่ม connection ก็เป

คือปกติเว็บจะเข้าได้น่ะครับ แต่ช่วงเวลาที่คนเข้าเยอะ ๆ (ตอนเย็น ๆ ) จะขึ้น

Warning: mysql_connect() [function.mysql-connect]: Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (11)
Error! Connect Database

ซึ่งจะขึ้นข้อความนี้บ่อยเลยน่ะครับ แต่ไม่ได้ขึ้นทุกครั้งนะครับ ลองปรับ max_connections ใน my.cnf แล้วก็ยังไม่ดีขึ้น ไม่ทราบว่ามีสาเหตุมาจากส่วนอื่นหรือป่าวครับ

# Example MySQL config file for very large systems.
#
# This is for a large system with memory of 1G-2G where the system runs mainly
# MySQL.
#
# You can copy this file to
# /etc/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options (in this
# installation this directory is /var/lib/mysql) or
# ~/.my.cnf to set user-specific options.
#
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.

# The following options will be passed to all MySQL clients
[client]
#password	= your_password
port		= 3306
socket		= /var/lib/mysql/mysql.sock

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port		= 3306
socket		= /var/lib/mysql/mysql.sock
skip-locking
key_buffer = 512M
max_allowed_packet = 1M
max_connections=1024
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 2

# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
# 
#skip-networking

# Replication Master Server (default)
# binary logging is required for replication
log-bin=mysql-bin

# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id	= 1

# Replication Slave (comment out master section to use this)
#
# To configure this host as a replication slave, you can choose between
# two methods :
#
# 1) Use the CHANGE MASTER TO command (fully described in our manual) -
#

รายงานสภาพ

ปิด pconnect
limit connection per user ด้วยครับ (เอาสัก 10 ก็พอ เพราะตั้งแต่ตั้งมายังไม่เคยเจอใครใช้เกิน)
ตั้ง timeout ต่ำๆ

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

แล้วลองลง mtop ดูด้วยก็ได้ ว่าใครที่ กินไปเยอะ หรือกินแล้วไม่ปล่อยก็ค่อยเข้าไป limit ราย user อีกที

ในเครื่องมีกี่เว็บครับ เดาว่ามีเว็บหนักๆเว็บเดียว เพราะมี my.cnf มาให้ดู

คน online ที่ว่าเยอะนี่ประมาณเท่าไหร่ครับ ตอนที่ล่ม
ส่วน httpd.conf ปรับตั้งไว้เท่าไหร่

ในเบื้่องต้นตรวจหา slow query ก่อนเลยครับ
จากนั้นไล่สร้าง index field ที่มีปัญหา เว็บก็จะเร็วขึ้นพอสมควร

ถัดมาก็ปรับค่า maxcliets ให้เหมาะสมกับกำลังเครื่อง
อันนี้ต้องดู server status ประกอบ ถึงจะบอกได้ว่าเท่าไหร่ดี

ต้องขออภัยด้วยครับ ที่เข้ามาตอบช้า อันนี้เป็น spec server นะครับ

P4 3.0Ghz
Ram 2gb

ไฟล์ส่วนใหญ่ในเว็บจะเป็น html เบา ๆ ครับ แต่จะมี code javascript สำหรับเก็บข้อมูล page view ทำให้มีการติดต่อกับดาต้าเบส
และมีหน้าลิสต์รายชื่อบทความอีก 1 หน้า นอกนั้นเป็น html ทั้งหมดครับ

Error Connection จะเป็นเฉพาะตอนคนเข้าเว็บเยอะ ๆ ครับ ช่วงคนน้อยจะไม่เป็น
เวลาเป็น ไม่ได้เป็นทุกครั้งนะครับ แบบเปิดหน้ารายชื่อบทความสัก 5 ครั้ง จะเป็นสัก 3 ครั้ง ครับ

ในเซิฟเวอร์มีเว็บเดียวครับ 100,000UIP/day - 1,000,000 Pageview/day

อันนี้เป็นรายละเอียด my.cnf ของผมนะครับ (ดัดแปลงจากของคุณ Icez มา)

[mysqld]
port = 3306
skip-locking
log-slow-queries
max_allowed_packet = 1M
key_buffer = 512M
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
max_heap_table_size = 128M
thread_cache = 16
table_cache = 1024

#query caching configuration
query_cache_type = 1
query_cache_size = 32M
query_cache_limit = 32M


# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 2
skip-name-resolve
max_connections = 1024
long-query-time = 2
skip-bdb
skip-innodb

tmp_table_size = 32M
max_tmp_table = 192
server-id = 1

# Uncomment the following if you are using BDB tables
#bdb_cache_size = 384M
#bdb_max_lock = 100000

# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /usr/local/var/
#innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend
#innodb_log_group_home_dir = /usr/local/var/
#innodb_log_arch_dir = /usr/local/var/
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 384M
#innodb_additional_mem_pool_size = 20M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 100M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates

[isamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

ส่วนอันนี้เป็น httpd.conf ครับ

<IfModule prefork.c>
StartServers

perl พยามหลักเลี่ยงใช้ได้แล้วมันกิน process time cpu
ดูแล้วควรเพิ่ม ram ไปเป็น 4GB เพราะ swap ram ทะลุไปขนาดนั้นแสดงว่า mysqld ขอ ram ไปใช้หมดและไม่พอ

apache slot ยังไม่เต็ม…ไม่ wait ครับ

จ่ายเงินซื้อแรมให้ mysql หน่อยครับ…มันหิวแรมเอาไปทำ query ครับ (เครื่องมันอดยากไปหน่อย) lol

อ่า เพิ่มเติมครับ เวลา error จะขึ้นข้อความดังนี้ครับ

Warning: mysql_connect() [function.mysql-connect]: Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (11)

ลองหาข้อมูลในเน็ตจะมีแต่ขึ้น code (2) ทั้งนั้นเลย ส่วน code (11) แบบที่ผมเป็นไม่ค่อยมีข้อมูลเลย อยากทราบว่า code พวกนี้มันบอกอะไรหรอครับ สามารถดูรายละเอียดได้ที่ไหน เพราะลองไปหาดูในเว็บ mysql แล้วก็ยังไม่เจอครับ

ขอบคุณครับ

อยากที่ผมบอกนะครับ… Query SQL มันต้องการ ram จริงที่ Allocated ให้ใน Buffer key เอาไปทำ query process…
คุณปล่อยให้มันไปขุดเอา ram swap มาทำงาน…มันก็ช้า

จังหวะทำให้หายใจไม่ทัน connection คืนค่าล้มเหลวกลับมาให้เป็นบางจังหวะๆๆ

Warning: mysql_connect() [function.mysql-connect]: Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (11)
ล้มเหลว…

code (11) คือปัญหา ram (อาจจะเสีย) เหมือน system ไม่คืนหน่วยความจำและมักจะรายงานออกมาจาก message log กำกับจาก httpd นะครับ

log mysql เต็มหรือปล่าว

ลองลบออกให้หมดครับ

df -h เช็คดู diskspace ได้ครับ log มันจะปรับของมันเองหากดิสไม่เต็ม ดู /var partition แค่นั้นจบ.

แรมอาจจะเสีย หรือแรมอาจจะไม่พอ อย่างที่คุณ smartnet.co.th ว่าเอาไว้ใช่ไหมครับ อ่อ ๆ อย่างนั้นจะได้แก้ได้ถูกจุด เดี๋ยวจะไปเพิ่มแรมเป็น 4gb แล้วจะกลับมารายงานผลครับ

ขอบพระคุณ คุณ smartnet.co.th มาก ๆ เลยนะครับ

แก้ 2 บรรทัดนี้ แบบนี้ครับ

max_connections=8000
#log-bin=mysql-bin

error code 11 จำไว้ได้เลยว่าแรมมีปัญหา…ระบบมันเตือนว่าแรมไม่พอจน crash ไปครับ… Linux เก่งตรงเรื่อง kill process ที่ตายทิ้งไปด้วยเช่นกัน
มันคือการ kill process คุณทิ้งที่มันล้นออกมาครับแล้วแจ้งให้ log ทราบว่า…ฉันได้ kill เธอนะ… (11)

หลังจากเพิ่มแรมแล้ว…ต้องดูว่า CPU มันกี่ % ด้วยนะครับ ที่เห็นมัน 97% เออ… มันก็ทำงานเต็มที่ของมันแล้วนะ…ที่เห็นๆขอแรมเพิ่มให้มันอีกนิด tune กันอีกหน่อย เอา perl ออกไปเพราะมันกิน time cpu

เปิด time out ให้น้อยลงไปมันจะได้ไม่ wait…

ดูเรื่องโดนใช้ swap ram ดีๆว่าอะไรไปดึงกันแน่…เห็น slow query ขนาดนั้น…น่าจะปรับ SQL Optimize กันหน่อยจะช่วยได้มากๆ

ไม่เกี่ยวกับ memory ไม่พอ ก็คุณเล่นไปเก็บ log มันก็หนักดิ
ถ้าไม่ทำ replicate ก็ไม่ต้องเก็บ แล้ว df -h ดูว่า disk เต็มป่ะ

ข้อสังเกตของผม

  1. ไม่มี slow queries (ดูจาก mytop)
  2. ตารางก็ทำ index เรียบร้อย (ดูจาก mytop เช่นกัน)
  3. cpu พุ่งกระฉูด จาก mysql
  4. ram มาจาก apache จำนวน ประมาณ 400 กว่า process (process ละ 4-8 mb)

เข้าใจว่า cpu คุณคงสุดแล้วล่ะครับ
แนะนำ

  1. เปลี่ยน cpu ไปใช้ที่แรงกว่านี้
  2. เพิ่มเครื่องไปอีก

ลืมดู ในเซิฟเวอร์มีเว็บเดียวครับ 100,000UIP/day - 1,000,000 Pageview/day

แค่นี้ก็เทพละครับ ผมแค่ไม่ถึง 100000 UIP ยังใช้ 20 เครื่องเลย แต่ PV มากกว่านี้นะ

ดูจาก slot apche มันก็ไม่ wait… จนน่าเกลียดนะ แต่ทำไม mysqld ลอยค้าง (ลอยค้างตลอดเลยหรือเปล่า) หากมีเลือนไปเลือนมาก็น่าคิด
แต่เห็น load ไปที่ 20 กับ cpu ตัวนี้ (หนักไปหรือเปล่า) dual core ยังพอว่า

ลองลด httpd ลงก่อนครับคุณปรับใช้เกินกำลัง hardware ไปมากเกิน
<IfModule prefork.c>
StartServers

[quote author=smartnet.co.th link=topic=12055.msg123482#msg123482 date=1217427575]
ดูจาก slot apche มันก็ไม่ wait… จนน่าเกลียดนะ แต่ทำไม mysqld ลอยค้าง (ลอยค้างตลอดเลยหรือเปล่า) หากมีเลือนไปเลือนมาก็น่าคิด
แต่เห็น load ไปที่ 20 กับ cpu ตัวนี้ (หนักไปหรือเปล่า) dual core ยังพอว่า

ลองลด httpd ลงก่อนครับคุณปรับใช้เกินกำลัง hardware ไปมากเกิน
<IfModule prefork.c>
StartServers