性能调优
硬件优化
cpu 主频高、更多核CPU http://product.pconline.com.cn/hot/server_cpu/ E3->i7处理器
内存 主频高、内存量大,ECC内存可以容错,奇偶校验,支持热拔插
磁盘 raid(磁盘阵列,数据同时保存到多块磁盘中速度提升,备份容错)、ssd(新的技术,固态硬盘,不用磁头,读写速度很快,成本高一些)
网卡 100M网卡指的是数据流,单位比特bite,1Byte字节=8bite比特,100M/8=12.5M字节/s秒
服务器网卡使用的千兆网卡,对应千兆交换机和路由器,双网卡绑定类似磁盘的raid传输加快。
架构优化
接入优质CDN 代理+缓存
优化nginx配置 && 调整内核参数 http://blog.chinaunix.net/uid-25266990-id-2985541.html(为什么不用apache http://blog.csdn.net/xifeijian/article/details/17385831)
worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数。
use epoll; Nginx采用epoll模型,异步非阻塞。对于Nginx来说,把一个完整的连接请求处理都划分成了事件,一个一个的事件。比如accept(), recv(),磁盘I/O,send()等,每部分都有相应的模块去处理,一个完整的请求可能是由几百个模块去处理。真正核心的就是事件收集和分发模块,这就是管理所有模块的核心。只有核心模块的调度才能让对应的模块占用CPU资源,从而处理请求。
keepalive_timeout 60; keepalive 超时时间。
open_file_cache max=102400 inactive=20s; open_file_cache_valid 30s;这个是指多长时间检查一次缓存的有效信息。
下面贴一个完整的内核优化设置:
net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 net.ipv4.tcp_max_tw_buckets = 6000 net.ipv4.tcp_sack = 1 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_rmem = 4096 87380 4194304 net.ipv4.tcp_wmem = 4096 16384 4194304 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.netdev_max_backlog = 262144 net.core.somaxconn = 262144 net.ipv4.tcp_max_orphans = 3276800 net.ipv4.tcp_max_syn_backlog = 262144 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_synack_retries = 1 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_mem = 94500000 915000000 927000000 net.ipv4.tcp_fin_timeout = 1 net.ipv4.tcp_keepalive_time = 30 net.ipv4.ip_local_port_range = 1024 65000
下面是一个简单的nginx 配置文件:
user www www; worker_processes 8; worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000; error_log /www/log/nginx_error.log crit; pid /usr/local/nginx/nginx.pid; worker_rlimit_nofile 204800; events { use epoll; worker_connections 204800; } http { include mime.types; default_type application/octet-stream; charset utf-8; server_names_hash_bucket_size 128; client_header_buffer_size 2k; large_client_header_buffers 4 4k; client_max_body_size 8m; sendfile on; tcp_nopush on; keepalive_timeout 60; fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 4k; fastcgi_buffers 8 4k; fastcgi_busy_buffers_size 8k; fastcgi_temp_file_write_size 8k; fastcgi_cache TEST; fastcgi_cache_valid 200 302 1h; fastcgi_cache_valid 301 1d; fastcgi_cache_valid any 1m; fastcgi_cache_min_uses 1; fastcgi_cache_use_stale error timeout invalid_header http_500; open_file_cache max=204800 inactive=20s; open_file_cache_min_uses 1; open_file_cache_valid 30s; tcp_nodelay on; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; server { listen 8080; server_name backup.aiju.com; index index.php index.htm; root /www/html/; location /status { stub_status on; } location ~ .*\.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fcgi.conf; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ { expires 30d; } log_format access '$remote_addr -- $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; access_log /www/log/access.log access; }
设置浏览器缓存
(apache http://www.apelearn.com/bbs/thread-5357-1-1.html
http://www.apelearn.com/bbs/thread-11450-1-1.html
nginx http://www.apelearn.com/bbs/thread-11821-1-1.html)
启用压缩技术节省带宽消耗
(apache http://www.apelearn.com/bbs/thread-5528-1-1.html
nginx http://www.111cn.net/sys/nginx/69492.htm)
业务划块
不使用或者少使用共享存储
nfs共享了数据,附件共享,但是程序就不应该共享,程序很久都不用修改,读取代码反而需要使用网路传输,占用网络资源,性能降低。
用nosql替代mysql,使用MongoDB做存储,不做缓存。
(http://blog.sina.com.cn/s/blog_493a84550101e9a1.html)
静态库:个人的联系方式,企业相关的资料文档,企业的地址信息,企业的账户信息
动态库:争取企业的拜访记录,不断变化
使用异步通信 (http://kb.cnblogs.com/page/537753/)
小案例(小米抢购系统 http://www.csdn.net/article/2014-11-07/2822545)
限流排队 (
http://my.oschina.net/yonghan/blog/473790)
程序优化
在线检测网站元素 http://www.webpagetest.org/
减少http请求数(合并css,js,图片),将多个CSS合并,减少并发数量
记录慢执行/查询日志,mysql的慢查询日志,建立索引,nfs网络延迟也可能造成慢查询
LAMP:使用该方法查询:http://www.apelearn.com/bbs/thread-5569-1-1.html
将动态内容静态化,网站的很多一些不改动的文字直接保存,用户访问读取整个文件。
访问量极大打开的网站,直接curl http:***.html > 1.html
5风中curl,更新一下。
图片延迟加载,淘宝,兰亭的主站技术,先加载网站的主框架,图片最后加载,滚动滑轮,才加载对应页面的图片。
动静分离,将一些视频和图片保存在另外域名的服务器上,使用rewrite,该网站上只保留链接。用户上传是http的post或者ftp上传到另外一台服务器,用户点击获取是通过链接打开另外一台服务器内容,实现动静分离。
应用无状态(淘宝session框架)
用户登录淘宝或者阿铭论坛,关闭浏览器,然后又打开,显示登录状态。为什么?
本地的cookies记录的session登录信息。淘宝就是使用本地的cookies验证,这样做也存在一个风险,如果用户的cookies被***得到,就会通过你的用户登录淘宝。
第一次登录,到A服务器
第二次登录,到B服务器
显示未登录,如何解决?
使用redis或者memcached做共享session验证,但是并发量极大,这样就是瓶颈,怎么办?
淘宝使用本地cookies做sesion验证。