Swap memory exhausting server even site has small visitors

Solution 1:

We can see from your updated output that you have 34 PHP workers running (not counting the master process), all of which are taking up memory and completely idle. This means you have tuned php-fpm to run on a much larger capacity machine with far more than the traffic you are actually getting. Or, perhaps, have not tuned it at all.

At the moment, those processes are taking up over 3/4 of your VM's RAM and giving you absolutely no benefit.

So, check the tuning in the php-fpm pool configuration, e.g. the default /etc/php-fpm.d/www.conf. For a small VPS like that I would probably start somewhere around:

pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 3
pm.max_spare_servers = 5

Solution 2:

From the looks of, you need to tune MYSQL for a small VPS setup. By default, it'll gobble up as much RAM as possible.

Copied from this site so it'll remain available, my.cnf:

[mysqld]
     port            = 3306
     socket          = /var/lib/mysql/mysql.sock
     skip-locking
     key_buffer = 16K
     max_allowed_packet = 1M
     table_cache = 4
     sort_buffer_size = 64K
     read_buffer_size = 256K
     read_rnd_buffer_size = 256K
     net_buffer_length = 2K
     thread_stack = 64K

     # For low memory, InnoDB should not be used so keep skip-innodb uncommented unless required
     skip-innodb

     # Uncomment the following if you are using InnoDB tables
     #innodb_data_home_dir = /var/lib/mysql/
     #innodb_data_file_path = ibdata1:10M:autoextend
     #innodb_log_group_home_dir = /var/lib/mysql/
     #innodb_log_arch_dir = /var/lib/mysql/
     # You can set .._buffer_pool_size up to 50 - 80 %
     # of RAM but beware of setting memory usage too high
     #innodb_buffer_pool_size = 16M
     #innodb_additional_mem_pool_size = 2M
     # Set .._log_file_size to 25 % of buffer pool size
     #innodb_log_file_size = 5M
     #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 = 8M
     sort_buffer_size = 8M

     [myisamchk]
     key_buffer = 8M
     sort_buffer_size = 8M

     [mysqlhotcopy]
     interactive-timeout

Adjust to suit, but that should work well on a 512MB VPS. If you use InnoDB, you'll need to enable it.