前端优化
1.减少http请求次数
图片、css、script等等这些都会增加http请求数,减少这些元素的数量就能减少响应时间
把多个JS、CSS在可能的情况下写进一个文件,页面里直接写入图片也是不好的做法,应该写进CSS里,小图拼合后利用 background 来定位
2.充分利用浏览器缓存
expires
,cache-control
,last-modified
,etag
3.分布式存储前端资源
利用cdn存储前端资源
4.多域名访问资源
浏览器对同一域名的并行请求数有上限,多个域名则支持更多并行请求
使用同一域名的时候无用的 cookie 简直是噩梦
5.资源数据压缩
开启gzip
前端资源本身的压缩,js/css 打包编译(去掉空格,语意简化)图片资源的压缩等
6.优化首屏显示速度
资源的按需加载,延时加载
图片的懒加载
Nginx优化
- Nginx本身
- 高层
user www-data; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofile 100000;
说明:
(1)worker_processes auto;
设置多少子进程
(2)worker_rlimit_nofile 65535;
worker进程的最大打开文件数限制,设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件,所以把这个值设高,就不会有“too many open files”问题了
2.event
所有处理连接的设置
events { worker_connections 2048; multi_accept on; use epoll; }
说明:
(1)worker_connections 65535; 子进程最多处理的连接数
(2)multi_accept on ; 告诉nginx收到一个新连接通知后接受尽可能多的连接
(3)use epoll ; 多路复用(use 设置用于复用客户端线程的轮询方法。如果你使用Linux 2.6+,你应该使用epoll)
3.http模块
http { server_tokens off; sendfile on; tcp_nopush on; tcp_nodelay on; access_log off; error_log /var/log/nginx/error.log crit; keepalive_timeout 10; client_header_timeout 10; client_body_timeout 10; reset_timedout_connection on; send_timeout 10; limit_conn_zone $binary_remote_addr zone=addr:5m; limit_conn addr 100; include /etc/nginx/mime.types; default_type text/html; charset UTF-8; gzip on; gzip_disable "msie6"; gzip_proxied any; gzip_min_length 1000; gzip_comp_level 6; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; open_file_cache max=100000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
说明:
(1)server_tokens off ; 关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的
(2)sendfile on; 是对文件I/O的系统调用的一个优化,系统api
(3)tcp_nodelay on; (Nginx 仅在将连接转变为长连接的时候才被启用)
(4)tcp_nopush on; (Nginx 仅在使用sendfile的时候才开启)
(5)access_log off; 设置nginx是否将存储访问日志。关闭这个选项可以让读取磁盘IO操作更快
(6)error_log /var/log/nginx/error.log crit; 只记录严重的错误
(7)keepalive_timeout 10; 给客户端分配keep-alive链接超时时间。服务器将在这个超时时间过后关闭链接
(8)client_header_timeout,client_body_timeout 设置请求头和请求体(各自)的超时时间
(9)reset_timeout_connection ,告诉nginx关闭不响应的客户端连接
(10)send_timeout ,指定客户端的响应超时时间
(11)imit_conn_zone ,设置用于保存各种key(比如当前连接数)的共享内存的参数。5m就是5兆字节,这个值应该被设置的足够大以存储(32K*5)32byte状态或者(16K*5)64byte状态。
(12)limit_conn ,为给定的key设置最大连接数。这里key是addr,我们设置的值是100,也就是说我们允许每一个IP地址最多同时打开有100个连接
(13)include 只是一个在当前文件中包含另一个文件内容的指令。这里我们使用它来加载稍后会用到的一系列的MIME类型。
(14)default_type 设置文件使用的默认的MIME-type
(15)charset 默认字符集
(16)数据返回开启gzip压缩
gzip_disable 为指定的客户端禁用gzip功能
gzip_static 告诉nginx在压缩资源之前,先查找是否有预先gzip处理过的资源
gzip_proxied 允许或者禁止压缩基于请求和响应的响应流
gzip_min_length 设置对数据启用压缩的最少字节数
gzip_comp_level 设置数据的压缩等级
gzip_type 设置需要压缩的数据格式
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 4;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/json;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth; gzip_disable "MSIE [1-6]/.";
(17)open_file_cache 打开缓存的同时也指定了缓存最大数目,以及缓存的时间
open_file_cache_valid 在open_file_cache中指定检测正确信息的间隔时间。
open_file_cache_min_uses 定义了open_file_cache中指令参数不活动时间期间里最小的文件数。
open_file_cache_errors 指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。
(18)静态资源使用 http 缓存协议
location ~ .*/.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
(19)如果是反向代理web服务器,需要配置fastcgi相关的参数
fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k;
- tcp/ip 网络协议配置
- /proc/sys/net/ipv4/tcp_tw_recycle 1 开启TCP连接中TIME-WAIT sockets的快速回收,保证tcp_timestamps = 1
- /proc/sys/net/ipv4/tcp_tw_reuse 1 允许将TIME-WAIT sockets重新用于新的TCP连接
- /proc/sys/net/ipv4/tcp_syncookies 0 是否需要关闭洪水抵御 看自己业务,比如秒杀,肯定需要关闭了
- /proc/sys/net/ipv4/tcp_max_tw_buckets 180000 否则经常出现
time wait bucket table overflow
- Linux
- /proc/sys/net/core/somaxconn 65535
- ulimit -a 65535
php优化
1.升级到php7
2.opcode优化
php 5.5 之后好像就内置了,修改配置
opcache.revalidate_freq=60 opcache.validate_timestamps=1 opcache.max_accelerated_files=1000 opcache.memory_consumption=512 opcache.interned_strings_buffer=16 opcache.fast_shutdown=1
说明:
opcache.revalidate_freq ,设置缓存的过期时间
opcache.max_accelerated_files,控制内存中最多可以缓存多少个PHP文件
opcache.memory_consumption 获取opcache使用的内存的总量
3.php7hugepage使用
Hugepage 的作用:间接提高虚拟地址和内存地址转换过程中查表的TLB缓存命中率
4.代码伪编译
5.模板编译
6.xhprof
XHProf是facebook 开发的一个测试php性能的扩展
业务优化
1.非侵入式扩展开发
原来有一个model,叫问答,现在需要开发一个有奖问答,需要支持话题打赏,里面多了很多功能。这个时候应该利用面向对象的继承的特性
2.异步
能分步走就分步走,能不能请求的就不请求
3.静态化
专题页面,比如秒杀页面,为了应对更大的流量、并发
4.业务解耦
mysql优化
1.选择innodb
2.主键索引
innodb 需要一个主键,主键不要有业务用途,不要修改主键。
主键最好保持顺序递增,随机主键会导致聚簇索引树频繁分裂,随机I/O增多,数据离散,性能下降
3.字段
(1)能选短整型,不选长整型
(2)能选 char 就避免 varchar
(3)当使用 varchar 的时候,长度够用就行
(4)大文本单独分离,比如文章的详情,单独出一张表。其他基本信息放在一张表里,然后关联起来。
(5)冗余字段的使用,比如文章的详情字段,增加一个文章markdown解析之后的字段
4.索引
(1)没有索引的更新,可能会导致全表数据都被锁住。所以更新的时候要根据索引来做。
(2)联合索引的使用,联合索引“最左前缀”
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
值 | 说明 |
---|---|
const | 通过索引直接找到一个匹配行,一般主键索引的时候 |
ref | 没有主键索引或者唯一索引的条件索引,查询结果多行,在联合查询中很常见 |
index | 利用到了索引,有可能有其它排序,where 或者 group by 等 |
all | 全表扫描,没有使用到索引 |
有Using filesort
或者Using temporary
的话,就必须要优化了
5.收集慢索引
my.ini 配置里增加
long_query_time=2 log-slow-queries=/data/var/mysql_slow.log
6.使用nosql
一个非常复杂的查询列表可以将其插入zset 做排序列表,然后具体的信息,通过zset里面的纸去mysql 里面去查询
redis优化
(1)多实例化,更高效地利用服务器 cpu
(2)内存优化
redis.conf
hash-max-zipmap-entries 512 (hash-max-ziplist-entries for Redis >= 2.6) hash-max-zipmap-value 64 (hash-max-ziplist-value for Redis >= 2.6) list-max-ziplist-entries 512 list-max-ziplist-value 64 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 set-max-intset-entries 512
(3)尽可能使用使用 hashes ,时间复杂度低,查询效率高
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20380.html