在一位朋友告诉我他的 MySQL 使用了太多内存后,我试图帮助他解决他的服务器问题...事实证明,它不仅使用了大量内存,而且还运行了太多的 mysql 进程!
结果如下ps auxww|grep mysql
:http://pastebin.com/kYrHLXVW
因此基本上有 13 个 MySQL 进程,并且根据 mysqladmin 只有 1 个客户端连接...
过了一会儿,每个进程都会占用多达 50mb 的内存,最终会消耗大量内存......
我直接从 /usr/share/mysql 使用 my-medium.cnf 配置模板...我重新启动了 mysql 服务器,但是,一旦启动,13 个进程就会回来...我不知道问题出在哪里...任何想法/建议都将非常感谢!
答案1
mysql 9804 0.0 0.6 58556 22960 pts/0 S 12:43 0:00 \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
mysql 9807 0.0 0.6 58556 22960 pts/0 S 12:43 0:00 \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
mysql 9808 0.0 0.6 58556 22960 pts/0 S 12:43 0:00 \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
mysql 9809 0.0 0.6 58556 22960 pts/0 S 12:43 0:00 \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
mysql 9810 0.0 0.6 58556 22960 pts/0 S 12:43 0:00 \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
[ ... repeated output truncated ... ]
它们使用的并不是 13 * 50mb 的内存,而是大概 70mb 左右全部的。请记住,linux 将在进程之间共享未修改的内存页,因此如果您的服务器刚刚启动,则大部分内存都将被共享。事实上,由于 mysql 是线程化的,因此每个线程分配的内存可能甚至更少。如果您关心每个 mysql 进程的内存使用情况,请查看/etc/mysql/my.cnf
,并查看 mysqld 部分中的变量:
key_buffers
thread_stack
thread_cache_size
max_connections
query_cache_limit
query_cache_size
但请注意,这些都是非常强大的变量,如果将它们设置得太低,可能会轻易降低 mysql 性能,或者如果将它们设置得太高,则会浪费可以在其他地方使用的内存。
找出调整 mysql 实例的最佳方法的一个简单起点是运行你的应用程序一会儿,然后运行 mysqltune 脚本,它将分析你的性能计数器,然后对你应该在服务器配置中更改的内容提出建议。
答案2
Linux 将线程显示为单独的进程。MySQL 为每个连接启动一个线程。使用 运行ps
。f
例如,ps auxfw
将显示线程之间的关系。
有多少个与 MySQL 的连接?show full processlist;
在 MySQL 客户端中运行。从您显示的内容来看,我甚至不确定是否存在任何问题。
答案3
你可能想尝试MySQLTuner我发现它非常有用,它会建议您应该尝试调整哪些配置变量。