Apache Mysql 的优化

搞了两天,综合网上优秀BLOG并且联系实际整理了下 Apache Mysql 的优化, 虽然不一定适合每一个人,但里面的一些参数自己可以自己琢磨测试.不过Apache感觉不怎么样,爷爷的 15分钟在线 2000多IP就卡得不得了,每天90多W PV 都卡,看了下163他们的网络架构,不管是前端还是源段服务器都全是NGINX,看样子以后还得继续努力学习了,

Apache优化

KeepAlive On

KeepAliveTimeout 10

StartServers          5
MinSpareServers       10
MaxSpareServers      20
ServerLimit          1000
MaxClients          1000
MaxRequestsPerChild   10000

主 要优化这几个参数,在服务器完全可以承受访问量的时候建议把KeepAlive设置为 on,但网上很多人设置了on但是KeepAliveTime设置为 3-5秒,我认为这样设置根本就没有效果,还不如KeepAlive设置为off,打开一个网页算快也要2秒,人家不可能看3秒又去打开新页面,所以这样 设置个人觉得不科学,至少也要10秒,建议使用默认的15秒,如果服务器压力太大可以尝试KeepAlive设置off,以减少一些无效连接,

并发计算参考公式:
并发 = connection established / min(server keepalive, server timeout)
翻译一下:
并发 = 服务器传输链接数 除以 服务器软件的keepalive设置和服务器软件的超时设置之间的最小值

KeepAlive 设置off可以大大减小瞬间established值,这样就可以减少并发,利于服务器的负载.经过测试 www.itkylin.com是把KeepAlive设置off了,但QQ 163 sina是开启的,呵呵他们前端都是用的NGINX,可以不用担心并发数问题,以后还是选择NGINX好,继续学习 ….

下面是网上的优化说明,联系实际和中和很多博客,感觉描述得很好, MaxRequestsPerChild 这个值如果内存小,也设置小点.

1、KeepAlive On/Off
KeepAlive指的是保持连接活跃,类似于Mysql的永久连接。换一句话说,如果将KeepAlive设置为On,那么来自同一客户端的请求就不 需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担。一般情况下,图片较多的网站应该把KeepAlive设为On。

2、KeepAliveTimeOut number
如果第二次请求和第一次请求之间超过KeepAliveTimeOut的时间的话,第一次连接就会中断,再新建第二个连接。它的设置一般考虑图片或者JS等文件两次请求间隔.

3、MaxKeepAliveRequests 100
一次连接可以进行的HTTP请求的最大请求次数。将其值设为0将支持在一次连接内进行无限次的传输请求。事实上没有客户程序在一次连接中请求太多的页面,通常达不到这个上限就完成连接了。

4、StartServers        10
设置服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。

5、MinSpareServers     10
设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。

6、MaxSpareThreads     75
设置空闲子进程的最大数量。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。只有在非常繁忙机器上才需 要调整这个参数。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成 ”MinSpareServers+1″。

7、ServerLimit       2000
服务器允许配置的进程数上限。只有在你需要将MaxClients设置成高于默认值256的时候才需要使用。要将此指令的值保持和 MaxClients一样。修改此指令的值必须完全停止服务后再启动才能生效,以restart方式重启动将不会生效。

8、MaxClients        256
用于伺服客户端请求的最大请求数量(最大子进程数),任何超过MaxClients限制的请求都将进入等候队列。默认值是256,如果要提高这个值必须 同时提高ServerLimit的值。笔者建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机 器,那么初始值就是4000/2=2000。

9、MaxRequestsPerChild 0
apache.exe进程包括 一个是父进程、一个是子进程,父进程接到访问请求后,将请求交由子进程处理。MaxRequestsPerChild这个指令设定一个独立的子进程将能处 理的请求数量。在处理“MaxRequestsPerChild 数字”个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放,如果再有访问请求,父进程会重新产生子进程进行处理。  如果 MaxRequestsPerChild缺省设为0(无限)或较大的数字(例如10000以上)可以使每个子进程处理更多的请求,不会因为不断终止、启动 子进程降低访问效率,但MaxRequestsPerChild设置为0时,如果占用了200~300M内存,即使负载下来时占用的内存也不会减少。内存 较大的服务器可以设置为0或较大的数字。内存较小的服务器不妨设置成30、50、100,以防内存溢出。所以一般情况下,如果你发现服务器的内存直线上 升,建议修改该参数试试。注意,如果子进程有内存泄漏问题,这个参数设置为非0值可以回收子进程造成的内存泄漏。

Mysql 的优化

综合很多优秀BLOG,适合2-4G内存服务器,具体的还需要自己根据实际情况调整.不是说一个配置就可以适合所有服务器.

key_buffer = 256M
sort_buffer_size = 2M
read_buffer_size = 2M
myisam_sort_buffer_size = 64M
max_heap_table_size = 256M
max_allowed_packet = 16M
table_cache = 512
thread_cache = 64
thread_concurrency = 8
back_log = 200
max_connections=500
wait_timeout=30
read_rnd_buffer_size = 8M
long_query_time = 1
query_cache_size = 32M

key_buffer调整

show global status like ‘key_read%’;
mysql> show global status like ‘key_read%’;
+——————-+———+
| Variable_name     | Value   |
+——————-+———+
| Key_read_requests | 2055939 |
| Key_reads         | 2465    |
+——————-+———+
2 rows in set (0.00 sec)

Key_read_requests/Key_reads 小于 1:10000

show global status like ‘max_used_connections’;
mysql> show global status like ‘max_used_connections’;
+———————-+——-+
| Variable_name        | Value |
+———————-+——-+
| Max_used_connections | 4     |
+———————-+——-+
1 row in set (0.00 sec)

key_buffer=128M:全部表的索引都会尽可能放在这块内存区域内,索引比较大的话就开稍大点都可以,我一般设为128M,有个好的建议是把很少用到并且比较大的表想办法移到别的地方去,这样可以显著减少mysql的内存占用。
sort_buffer_size=1M:单个线程使用的用于排序的内存,查询结果集都会放进这内存里,如果比较小,mysql会多放几次,所以稍微开大一点就可以了,重要是优化好索引和查询语句,让他们不要生成太大的结果集。

另外一些配置:
thread_concurrency=8:这个配置标配=cpu数量x2
interactive_timeout=30
wait_timeout=30:这两个配置使用10-30秒就可以了,这样会尽快地释放内存资源,注意:一直在使用的连接是不会断掉的,这个配置只是断掉了长时间不动的连接。
query_cache: 这个功能不要使用,现在很多人看到cache这几个字母就像看到了宝贝,这是不唯物主义的。mysql的query_cache 在每次表数据有变化的时候都会重新清理连至该表的所有缓存,如果更新比较频繁,query_cache不但帮不上忙,而且还会对效率影响很大。这个参数只 适合只读型的数据库,如果非要用,也只能用query_cache_type=2自行用SQL_CACHE指定一些sql进行缓存。
max_connections:默认为100,一般情况下是足够用的,但是一般要开大一点,开到400-600就可以了,能超过600的话一般就有效率问题,得另找对策,光靠增加这个数字不是办法。

Social tagging: >