SWAPPINESS是LINUX 系统设置使用SWAP分区的意愿倾向
默认是60,如果倾向多使用SWAP分区可以设置100,反之不倾向使用SWAP分区的话可以设置10.
WAP是UNIX虚拟内存管理的基础架构之一,在WINDOWS上实际也有一个类似的虚拟内存管理机制,就是PAGEFILE.SYS。
主要是使用磁盘空间来模拟内存,或者是说当内存不够的时候使用磁盘空间。
不过现在LINUX为了充分使用物理内存,会把某些进程的内存移到SWAP上。
不过谁的进程都不愿意被移走,所以系统优先移动文件缓存区!
所以这个SWAPPINESS是设置 系统文件缓存和进程的内存优先级别!
anon_prio = swappiness;
file_prio = 200-anon_prio;
anon_prio 叫匿名块,也就是进程的内存. 从上面公式可以看出SWAPPINESS设置大小就是进程优先级别, 越小越不优先,越大越优先. 而文件缓存优先级别反而是200-进程优先级别.
SWAPPINESS设置成0, 并不是关闭进程被SWAP的开关!
不管怎么样,只要内存不足就会SWAP,无论是文件还是进程,都逃不掉的!
为了防止物理内存与SWAP都完全耗尽的情况发生,LINUX还引入了OOM KILLER机制来确保最坏的情况下,确保系统还能最低限度的运行。因为MYSQL是一种单进程多线程的数据库,因此MYSQL服务进程使用的内存会相当大,因此很容易被误杀。OOM KILLER总是找OOM_SCORE比较高的进程下手。
所以选择进程级别的数据库,比如ORACLE 和PG!
不过进程数据库带来个问题,它没有TREACH_CAHE。没有复用的线程连接池。既然没有线程,那么就在应用程序搞个链接池呗!比如C3P0,DBCP等JAVA框架!
连接池的作用是除了链接复用外,主要是解决把短链接优化成长链接。因为链接的建立和连接的释放在LINUX系统里是昂贵操作,低频率连接无感知。而高频链接就是个问题!
连接池初始化多少个链接数呢?才是合适啊?如果数据库的PROCESS设置了3000,是否意味着连接池最大连接数也可以设置3K呢?
连接数意外着是并发数据,同时向数据库获得连接,并向数据库发生QPS请求,或者是TPS请求。对数据库来说是3K并发量!
提高并发量的前提是
第一点 系统有足够资源来支撑。
第二点 就是资源分割合理,减少资源的争用。
并发,并行,多线程其实都是一个概念!
为什么要多线程,并行执行呢?单线程,串行,单发不香吗?其实主要是嫌弃它慢啊,而且系统资源很大的空闲。假如单发很快,就没有必要搞多线程啦!
第三点 单线程,单发,串行足够慢
那么数据库连接池应该设置成多大呢?结果可能会让你惊讶,因为这个问题的正确问法是:
“这个数据库连接池应该设置成多小呢?”
下面这个视频是Oracle Real World Performance Group发布的,请先看完:
http://www.dailymotion.com/video/x2s8uec
视频中对Oracle数据库进行压力测试,9600并发线程进行数据库操作,每两次访问数据库的操作之间sleep 550ms,一开始设置的中间件线程池大小为2048:
2048连接时的性能数据
每个请求要在连接池队列里等待33ms,获得连接后执行SQL需要77ms
此时数据库的等待事件是这个熊样的:
能看到,中间件连接池从2048减半之后,吐吞量没变,但wait事件减少了一半。
接下来,把数据库连接池减到96,并发线程数仍然是9600不变。
96个连接时的性能数据
队列平均等待1ms,执行SQL平均耗时2ms。
wait事件几乎没了,吞吐量上升。
没有调整任何其他东西,仅仅只是缩小了中间件层的数据库连接池,就把请求响应时间从100ms左右缩短到了3ms。
But why?
主要是连接数多了,发生并发争用!主要是违背了前3点其中一点!
连接数设置多小才合适,需要对应用进行压测。你的应用是混合类型,OLTP,OLAP还是啥的?做了读写分离吗?
解析
有硬解析,比如MYSQL
有软件解析,比如PG和ORACLE共享池
有软软解析,比如ORACLE-PGA 游标缓存。
还有无解析,直接在客户端上缓存游标
JAVA MYBATIS 设置语句缓存 CACHE STATEMENT SIZE