小艾的自留地

Stay foolish, Stay hungry

Mysql 的连接方式有两种:tcp 和 socket。前者是基于tcp/ip协议,后者是基于socket 套接字。

具体:

  • tcp/ip:mysql -h 127.0.0.1 -uroot -p
  • socket:mysql -h localhost -uroot -p 或者 mysql -uroot -p

可以通过 tcpdump命令抓包。

指定源端口:

1
$ tcpdump -i lo0 port 3306

如果出现以下内容,表示本地没有lo0这个设备。

1
2
tcpdump: lo: No such device exists
(BIOCSETIF failed: Device not configured)

可以通过tcpdump -D 命令查看本地设备名称:

1
2
1.en0 [Up, Running]
2.lo0 [Up, Running, Loopback]

使用mysql -h 127.0.0.1 -uroot -p,可以看到Mysql 的连接过程是基于tcp/ip 协议。

当客户端退出Mysql 时,会发送四条记录,也就是tcp 的四次挥手。

socket 方式会快于tcp/ip

mysql 使用线程来处理连接,每当一个请求进来,MySQL会创建一个线程去处理请求,

可以使用show status命令查看当前处于连接状态的线程个数,所以在高并发下,这将给MySQL服务器带来巨大的压力,消耗服务器资源。

Mysql 线程池

实际上 mysql 实现了线程池,当客户端断开连接后,mysql 会将当前线程缓存起来,当下一次有新的请求进来时,无需创建新的线程。

查看线程池大小:

1
mysql> show variables like 'thread_cache_size';

设置线程池大小:

1
mysql> set global thread_cache_size = 20;

查看线程池状态:

1
2
3
4
5
6
7
8
9
10
mysql> show status like 'Threads_%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_cached | 8 |
| Threads_connected | 3 |
| Threads_created | 53 |
| Threads_running | 1 |
+-------------------+-------+
4 rows in set (0.02 sec)

其中:

  • Threads_cached:空闲线程数量。当有新的请求进来时,mysql 不会立即创建线程去处理,而是去Threads_cached查看空闲的连接线程,如果存在则直接使用,不存在则创建新的线程。
  • Threads_connected:当前处于连接状态的线程个数。
  • Threads_created:创建过的线程数,如果发现Threads_created值过大的话,表明 mysql 服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中Thread_cache_size值。
  • Threads_running:处于激活状态的线程的个数,这个一般都是远小于Threads_connected的。

线程池的出现解决了频繁的创建连接和销毁连接的问题,但仅有线程池还是不够的,不能解决客户端频繁连接mysql 带来的性能损耗。

参考链接

评论