zoukankan      html  css  js  c++  java
  • mysql 表锁进程非常多的情况

    今天要说的是mysql 的 MYISAM引擎下的表锁问题。

    通常来说,在MyISAM里读写操作是串行的,但当对同一个表进行查询和插入操作时,为了降低锁竞争的频率,根据concurrent_insert的设置,MyISAM是可以并行处理查询和插入的:

    当concurrent_insert=0时,不允许并发插入功能。
    当concurrent_insert=1时,允许对没有洞洞的表使用并发插入,新数据位于数据文件结尾(缺省)。
    当concurrent_insert=2时,不管表有没有洞洞,都允许在数据文件结尾并发插入。

    这样看来,把concurrent_insert设置为2是很划算的,至于由此产生的文件碎片,可以定期使用OPTIMIZE TABLE语法优化。

    max_write_lock_count:

    缺省情况下,写操作的优先级要高于读操作的优先级,即便是先发送的读请求,后发送的写请求,此时也会优先处理写请求,然后再处理读请求。这就造成一 个问题:一旦我发出若干个写请求,就会堵塞所有的读请求,直到写请求全都处理完,才有机会处理读请求。此时可以考虑使用 max_write_lock_count:

    max_write_lock_count=1

    有了这样的设置,当系统处理一个写操作后,就会暂停写操作,给读操作执行的机会。

    low-priority-updates:

    我们还可以更干脆点,直接降低写操作的优先级,给读操作更高的优先级。

    low-priority-updates=1

    综合来看,concurrent_insert=2是绝对推荐的,至于max_write_lock_count=1和low-priority- updates=1,则视情况而定,如果可以降低写操作的优先级,则使用low-priority-updates=1,否则使用 max_write_lock_count=1。

    set-variable = max_allowed_packet=1M
    set-variable = net_buffer_length=2K

    在myisam engine下

    1. 尽量使用insert into table_name values (…), (…..),(…..)这样形式插入数据,避免使用inset into table_name values (); inset into table_name values (); inset into table_name values ();

    2 增加bulk_insert_buffer_size(默认8M)

    3 如果是非空表,使用alter table table_name disable keys,然后load data infile,导入完数据在执行:

    alter table table_name enable keys. 如果是空表,就不需要这个操作,因为myisam表在空表中导入数据时,是先导入数据然后建立indexs。

    4 在插入数据时考虑使用:insert delayed….这样操作实际mysql把insert操作放到队列里面,进行相对集中的插入,速度更快。

    5. 使用load data infile 比使用insert 操作快近20倍,尽量使用此操作。

    上面这些是网上也查询看的别人写的,确实也比较详细,但是个人使用的时候,针对自己的情况运用了一些配置,开始还可以,但是随着访问pv量增大之后,就开始出现了一些问题。我们也用了  concurrent_insert = 2  这个参数,但是后面我选择了 low-priority-updates=1 这个参数配置,运行之后发现表的写和读的操作开始都在循环增多,因为我们的网站接口读和写的操作都比较多,开始也一直在排查其他问题,用  show processlist  命令查看mysql里面   Waiting for table level lock  这个表锁的进程占了百分之九十多,然后程序反应非常慢,而且还会间歇性出现 502 的报错。

    我们的服务器是32G内存,双8核cpu的配置:

    max_connections=10000
    max_connect_errors = 100000
    open_files_limit = 65535

    max_user_connections=8000
    #back_log = 1024

    key_buffer_size = 10G
    table_open_cache = 10000
    sort_buffer_size = 16M
    net_buffer_length = 8K
    read_buffer_size = 16M
    myisam_sort_buffer_size = 128M
    query_cache_min_res_unit = 2K
    query_cache_limit = 8M
    group_concat_max_len = 2147483647
    concurrent_insert = 2
    low-priority-updates=1

    thread_concurrency=32

    query_cache_size = 512M
    query_cache_type=1

    thread_cache_size = 512
    max_allowed_packet = 32M
    read_rnd_buffer_size = 16M
    tmp_table_size = 1G
    join_buffer_size = 16M

    bulk_insert_buffer_size=16M
    lower_case_table_names=1
    thread_stack=512K

    这里我简单贴一下配置参数,大家可根据自己的情况,不一定都要照搬。然后我们就是出现了表锁和502的问题,我也检查了好久,适用了很多网上大家发出来的论坛的解决办法,都无济于事。然后自己感觉,日pv达到几千万之后,有一些小的参数调整已经启不了太大作用了。后面才又想到mysiam的引擎方面调整了,这里主要就是我屏蔽了 low-priority-updates=1 这个参数,换成了  max_write_lock_count=1  这个参数,这个含义大家看上面的就有解释,不用我多做解释了,就是让读和写交替进行,不会说一直读或者一直写,然后这个调整对整个网站影响还是比较明显的,流程很多了。随着量增大以后可能还有各种各样的问题,大家根据情况,可以帮到大家最好。

  • 相关阅读:
    linux安装vsftpd服务器
    安装Twisted
    py文件转换为exe文件
    Python实现批量新建SecureCRT Session
    常见的字符编码
    心得 : 面向对象和面向过程的区别
    Apache配置HTTPS的过程小记
    关于oracle的sequence和trigger。
    oracle在drop表时要注意
    mysql中整数类型后面的数字,是不是指定这个字段的长度?比如int(11),11代表11个字节吗?
  • 原文地址:https://www.cnblogs.com/hurry-up/p/7766333.html
Copyright © 2011-2022 走看看