技术改变世界 阅读塑造人生! - shaogx.com

This string was altered by TechBlog\Plugins\Example.; This is an example to show the potential of an offcanvas layout pattern in Bootstrap. Try some responsive-range viewport sizes to see it in action.

MySQL性能优化之一:提高MySQL并发能力的思路

1、使用行级别锁,避免表级别或页级别锁尽量使用支持行级别锁的存储引擎,如InnoDB;只在读操作显著多于写作的场景中(如数据仓库类的应用)使用表级别锁的存储引擎,如MyISAM;。 2、降低热巨锁(hot gaint lock)出现的可能性以尽可能避免全局互斥量 临界区(仅允许单一线程访问的资源)会严重降低MySQL系统并发性;InnoDB缓冲池(buffer pool)、数据字典等都是常见的临界区;幸运的是,新版本的InnoDB已经能够较好的运行于多核处理器,支持使用innodb_buffer_pool_instances服务器变量建立多个缓冲池实例,每个缓冲池实例分别自我管理空闲列表、列表刷写、LRU以及其它跟缓冲池相关的数据结构,并通过各自的互斥锁进行保护。3、并行运行多个I/O线程 通过innodb_io_capacity服务器变量等增加磁盘I/O线程的数量可以提高前端操作(如SELECT)的性能,不过,磁盘I/O线程的数量不应该超过磁盘的IOPS(7200RPM的单块硬件的IOPS数量一般为100个左右)。 此外,异步I/O也可以在一定程度上提高系统的并发能力,在Linux系统上,可以通过将MySQL的服务器变量innodb_use_native_aio的值设定为ON设定InnoDB可以使用Linux的异步I/O子系统。4、并行后端任务 默认情况下,MySQL的清写(purge)操作(用于移除带删除标记的记录)由InnoDB的主线程完成,这可以降低内部资源竞争发生的概率,进而增强MySQL服务伸缩能力。不过,随着InnoDB内部各式各样的竞争越来越多,这种设置带来的性能优势已几乎不值一提,因此,生产环境中应该通过为innodb_purge_threads服务器变量设定为ON将主线程与清写线程分开运行。5、单线程复制模型中的SQL线程是一个热区 在从服务器上并行运行多个SQL线程可有效提高MySQL从服务器性能,MySQL 5.6支持多线程复制(每库一个复制线程);本文出自 “马哥教育Linux运维培训” 博客,转载请与作者联系!... 全文

mysql优化 马哥教育 mysql性能 mysql并发

MySQL百万级高并发网站实战攻略

在一开始接触PHP接触MYSQL的时候就听不少人说:“MySQL就跑跑一天几十万IP的小站还可以,要是几百万IP就不行了”,原话不记得了,大体就是这个意思。一直也没有好的机会去验证这个说法,一是从没有接手过这么大流量的网站,二是平时工作也比较忙,懒得去管这些,反正现在用不着,抱着这个想法把这个问题一直留到了最近,才把这个问题搞明白。... 全文

高并发 开源数据库 MySQL SUN

MySQL系列:innodb源码分析之线程并发同步机制

innodb是一个多线程并发的存储引擎,内部的读写都是用多线程来实现的,所以innodb内部实现了一个比较高效的并发同步机制。innodb并没有直接使用系统提供的锁(latch)同步结构,而是对其进行自己的封装和实现优化,但是也兼容系统的锁。我们先看一段innodb内部的注释(MySQL-3.23):Semaphore operations in operating systems are slow: Solaris on a 1993 Sparc takes 3 microseconds (us) for a lock-unlock pair and Windows NT on a 1995 Pentium takes 20 microseconds for a lock-unlock pair. Therefore, we have toimplement our own efficient spin lock mutex. Future operating systems mayprovide efficient spin locks, but we cannot count on that.... 全文

innodb MYSQL C 并发

MySQL系列:innodb源码分析之线程并发同步机制

innodb是一个多线程并发的存储引擎,内部的读写都是用多线程来实现的,所以innodb内部实现了一个比较高效的并发同步机制。innodb并没有直接使用系统提供的锁(latch)同步结构,而是对其进行自己的封装和实现优化,但是也兼容系统的锁。我们先看一段innodb内部的注释(MySQL-3.23):Semaphore operations in operating systems are slow: Solaris on a 1993 Sparc takes 3 microseconds (us) for a lock-unlock pair and Windows NT on a 1995 Pentium takes 20 microseconds for a lock-unlock pair. Therefore, we have toimplement our own efficient spin lock mutex. Future operating systems mayprovide efficient spin locks, but we cannot count on that.... 全文

innodb MYSQL C 并发

mysql主键设置成auto_increment时,进行并发性能测试出现主键重复Duplicate entry 'xxx' for key 'PRIMARY'

mysql主键设置成auto_increment时,进行并发性能测试出现主键重复Duplicate entry 'xxx' for key 'PRIMARY'解决方法:在my.cnf的[mysqld]片段中添加设置innodb_autoinc_lock_mode=0同时注意调大jdbc的活跃链接数,如设置 jdbc.maxActive=300,因为设置innodb_autoinc_lock_mode=0可能导致链接过多。... 全文

mysql auto_increment 主键重复 Duplicate primary 并发性能测试

myisam的并发读写原理

MYISAM自身是表锁,所以默认写入是不允许读写。但MYISAM为了提高性能,当写入是在文件的末尾,锁管理器允许读,因为数据库会记住写之前的文件位置,在未完成写入前不允许读写之后的位置数据,以此实现并发读写... 全文

mysql myisam 并发读写

高并发服务器的设计

做架构设计,难免有时候被人问及系统的瓶颈在哪,那首先来了解下什么是瓶颈?打个形象的比方,人的嘴巴可以吞下一整个面包,但是却咽不下去,因为食管不给力,它比较细,所以嘴巴能吞下的食物大小要受到食管的粗细限制。城市内部每天会产生几十万件跨城快递,可是跨城的交通不给力,只允许走小型卡车,一卡车一次就能装几千件,一天下来也不一定能投送的完。人在一定时间内能咽下多少食物,货运公司在一天运送多少货物,物理上叫做吞吐量,系统整体的吞吐量等于最小区域的吞吐量。下面这张图能够反映:土黄色管子的流量要受到红色部分的制约。服务器上也是这样,好一点的设计框架结合物理高配可以处理高达几十万的并发,像土黄色的管子,可是偏偏有一些模块像图中红色的管子那样,一秒中只能同时处理几百次,这样就严重拖慢了服务器的性能,成了瓶颈。现实开发中有时可能会要加上数据库模块,如mysql,虽然mysql号称每秒处理几十万的查询根本没问题,但那只是运算能力。服务器连mysql 是要通过tcp网络的,有连接就需要时间,再加上数据量如果大点,自然就成了瓶颈。相似的情况,一些特殊的业务,比如加解密服务,密钥和随机数的产生依赖加密机,中间件的性能就是我们图中的红管子。有些开发还会涉及到跨网服务器查询,比如腾讯电商会调用QQ服务器的登录网关,跨网查询的速度肯定没有本地执行的快。系统架构的设计是争对业务的,业务里如果存在这些红管子,就必须要有相应的解决办法。不同人的处理方法不同,据我经验,可以将瓶颈子分成两类:1.阻塞串行处理2.异步并行处理mysql,中间件的处理属于第一类,异步网关查询属于第二类。对于第一类,一种通用的解决方法是增加处理进程,其实是横向扩容的思想,打个比方,一个进程的并发是600,10个进程就可以达到6000了,如何才能将请求均匀地分配到这10个进程是关键。多个进程同时监听一个端口,负载均衡的方法很多,这里介绍nginx的做法,直接上代码://接收握手后连接 void ngx_event_accept(ngx_event_t *ev) { ... ngx_accept_disabled = ngx_cycle->connection_n / 8 - ngx_cycle->free_connection_n; ... } //事件模型处理函数 void ngx_process_events_and_timers(ngx_cycle_t *cycle) { ... if (ngx_use_accept_mutex) { if (ngx_accept_disabled > 0) { ngx_accept_disabled--; } else { if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) { return; } if (ngx_accept_mutex_held) { flags |= NGX_POST_EVENTS; } else { if (timer == NGX_TIMER_INFINITE || timer > ngx_accept_mutex_delay) { timer = ngx_accept_mutex_delay; } } } ... } //取得端口监听的锁 ngx_int_t ngx_trylock_accept_mutex(ngx_cycle_t *cycle) { ... if (ngx_enable_accept_events(cycle) == NGX_ERROR) { ngx_shmtx_unlock(&ngx_accept_mutex); return NGX_ERROR; } ... } //启动端口监听 static ngx_int_t ngx_enable_accept_events(ngx_cycle_t *cycle) { ngx_uint_t i; ngx_listening_t *ls; ngx_connection_t *c; ls = cycle->listening.elts; for (i = 0; i < cycle->listening.nelts; i++) { c = ls[i].connection; if (c->read->active) { continue; } if (ngx_event_flags & NGX_USE_RTSIG_EVENT) { if (ngx_add_conn(c) == NGX_ERROR) { return NGX_ERROR; } } else { if (ngx_add_event(c->read, NGX_READ_EVENT, 0) == NGX_ERROR) { return NGX_ERROR; } } } return NGX_OK; }从上面的代码可以看出,nginx用一个全局变量ngx_accept_disabled 来控制单个进程的负载,当负载达到一定值的时候,不再接受新的负载。对于第二类情况,解决的方法就像名字一样,异步并行解决。拿跨网查询为例:创建一个查询的请求,将请求放进事件模型中,等待服务端的返回,异步处理。熟悉nginx的就知道nginx的upstream反向代理,这个解决方案跟反向代理很像,只不过在与上游服务器交互的前后分别还有其他的业务处理,而且可能还会有多次交互。相应的流水图是这样的:当客户端请求量大时,事件模型的容量会成为瓶颈,这样仍然需要横向扩容的方式来解决,增加处理进程。这两种情况的处理方法大致如此,有时候特殊问题特殊对待,比哪数据库的瓶颈可以借助缓存解决,有些高配服务器的内存128G,甚至几台高配服务器只为一个业务,这样的情况下,不吃点内存难免对不起老板的money.... 全文

服务器 架构 并发 MySQL 反向代理

深入理解MVCC多版本并发控制

 多版本并发控制技术已经被广泛运用于各大数据库系统中,如Oracle,MS SQL Server 2005+, Postgresql, Firebird, Maria等等,开源数据库MYSQL中流行的INNODB引擎也采用了类似的并发控制技术.本文就将结合实例来解析不同事务隔离等级下INNODB的MVCC实现原理.1 MVCC概述 ... 全文

mysql MVCC 休闲 多版本并发控制 职场

MySQL数据库MVCC多版本并发控制简介

MySQL数据库的多版本并发控制MVCC的知识是本文我们主要要介绍的内容,接下来就让我们一起来了解一下这部分内容吧。MVCC... 全文

MySQL数据库 MVCC

MySQL支撑百万级流量高并发的网站部署详解

MySQL支撑百万级流量高并发的网站的部署方法是本文我们主要要介绍的内容,了解了这部分内容我们自己就能用MySQL来支撑百万级流量高并发的网站了,接下来我们就开始介绍这部分内容。1. MySQL服务器集群 由于是小公司在资金和成本上都有所限制,而且在技术上也没有几个技术员接触过,所以这个方法自然就让大伙否决了。... 全文

MySQL支撑百万级流量

1