zoukankan      html  css  js  c++  java
  • Linux-多维度服务器调优

    1.优化维度
    	优化目的
    		提高网站访问速度。网站架构的稳定性。用户体验。
    	优化实践
    		应用层面,架构层面,代码层面,硬件层面。
    	安全
    	监控
    	日志
    	流程制度
    	故障排查
    	
    2.硬件层选型
    	WEB服务器:硬盘不需要太大。因为要水平扩展。
    		CPU、内存、硬盘、RAID:提高硬盘读取速度,提高冗余。
    		JAVA项目占内存大,处理业务逻辑都在内存中。工作效率高。
    		PHP项目占内存少。
    	数据库服务器
    		硬盘、RAID:提高硬盘读取速度,提高冗余。 RAID5  RAID10
    		机械硬盘:300M/s      IOPS   INNODB
    	缓存服务器
    		内存要求高:64G 128G
    	负载均衡服务器
    		CPU配置要高。磁盘不用太大。
    
    3.系统层优化
    	磁盘IO调度算法选择
    		cat /sys/block/sda/queue/scheduler   配置某个磁盘的io算法路径。
    			noop [deadline] cfq   三种调度算法
    			centos7默认:deadline
    			deadline:此算法适合mysql服务器。一个时间内处理一个事件。一个时间内持续mysql读写IO
    			cfq:平均分配。
    			noop:维护一个队列。先进先出。 SID硬盘
    		修改调度方式:
    			echo cfq > /sys/block/sda/queue/scheduler
    	
    	减少SWAP分区使用
    		echo 0 > /proc/sys/vm/swappiness   
    		会导致磁盘IO速度慢几十倍。
    	
    	增大打开文件描述数量
    		每个用户访问一次index.html就是打开一个index.html文件。
    		调整ulimit -n 数值。
    			ulimit -SHn 10240  设置为10240.对当前登录的系统用户生效。
    		
    		全部配置
    		vi /etc/security/limits.conf
    		 在最后增加
    		 * soft nofile 65535    软限制,最大打开文件数65535
    		 * hard nofile 65535    硬限制,最大打开文件数65535
    		
    	内核参数调优
    		sysctl -a |wc -l   查看部分内核参数。
    		
    		sysctl -a |grep tcp
    			net.ipv4.tcp_max_syn_backlog = 4096   最大的syn队列长度。设置为4096
    				TCP建立连接的时候,第一次发的请求。
    		
    			net.ipv4.tcp_syncookies = 1   需要开启。
    				如果不开启,当syn请求数量大于最大值时,会拒绝syn请求。
    				开启后会将syn超出最大值的请求连接缓存起来。
    		
    			net.ipv4.tcp_fin_timeout = 30   默认60秒,设置小一点。
    			 建立TCP连接时用户端的超时时间。如果不断开,就会占用TCP资源。
    			
    			
    			mysql和nginx静态服务器中打开。lvs和负载均衡不建议开启。
    			net.ipv4.tcp_tw_recycle = 1  1为开启。
    				netstat -anutp 的State中状态TIME的快速回收连接资源。
    			net.ipv4.tcp_tw_reuse = 1   1为开启。
    				如果有新的TIME连接请求,会用上次为断开的TIME请求连接。
    				
    		保存在:vi /etc/sysctl.conf
    			加在最后,保存。
    		刷新:sysctl -p
    
    4.软件层调优
    	4.1Nginx基本调优
    		
    		vi /etc/nginx/nginx.conf
    			user  nginx;
    			worker_processes  1;   设置为cpu核心数
    			error_log  /var/log/nginx/error.log warn;
    			pid        /var/run/nginx.pid;
    			events {
    				use epoll;  默认是epoll模型。
    				worker_connections  4096;   设置为最大连接数。
    			}
    
    			http {
    				include       /etc/nginx/mime.types;    引入的默认传输类型。
    				default_type  application/octet-stream;   如果默认的传输类型中没有的,就使用此文档流方式传输。
    				log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    								  '$status $body_bytes_sent "$http_referer" '
    								  '"$http_user_agent" "$http_x_forwarded_for"';
    				access_log  /var/log/nginx/access.log  main;
    				sendfile        on;    提高处理IO的性能。 
    								传统读取:用户->进程(socket buffer)->用户态->内核缓冲区->内核->磁盘
    								Sendfile: 用户->进程(socket buffer)->内核缓冲区->内核->磁盘
    				#tcp_nopush     on;
    				keepalive_timeout  30;    长连接超时时间。设置为30秒,减少tcp连接
    				#gzip  on;    压缩文件,提高传输速度。但增加服务器CPU开销。
    				include /etc/nginx/conf.d/*.conf;
    			}
    		
    		七层代理层调优:代理缓存
    			vi /etc/nginx/nginx.conf  #nginx全局文档配置。
    			http {
    				...
    				keepalive_timeout  65;
    				#gzip  on;
    				
    				proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=proxy_cache_zone:128m inactive=5m max_size=10g;
    				# 缓存目录  目录层级  缓存区名称和大小  移除多长时间未访问的缓存数据   最大占用磁盘空间
    				proxy_buffering on; # 默认on,是否缓存后端服务器响应
    				proxy_buffer_size 64k; # 缓存区大小
    				proxy_buffers 8 32k; # 指定多少与多大缓存区来缓存后端服务器响应
    				proxy_ignore_headers Set-Cookie; # 忽略缓存cookie
    				proxy_set_header Host $host; # 添加请求头Host字段值为本机IP地址
    				proxy_set_header X-Real-IP $remote_addr; # 添加请求头X-Real-IP值为客户端IP
    				proxy_set_header X-Forwarded-For $http_x_forwarded_for; #前面所经过的代理ip都存起来。
    				proxy_connect_timeout 60s; # 默认60s,与后端服务器建立连接超时时间
    				proxy_read_timeout 300s; # 默认60s,读取后端服务器响应超时时间
    				proxy_send_timeout 300s; # 默认60s,发送请求到后端服务器超时时间
    			}
    		
    			vi /etc/nginx/conf.d/wp.aliangedu.com.conf  #PHP-FPM项目代理缓存
    			server {
    				listen 80;
    				server_name wp.aliangedu.com;
    				location / {
    					fastcgi_pass dynamic.wp;
    					fastcgi_index index.php;
    					fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
    					include fastcgi_params;
    				}
    				location ~ .(html|css|js|jpg|png|gif)$ {
    					proxy_pass http://static.wp;
    					proxy_cache proxy_cache_zone; # 指定缓存区名称 http{keys_zone=proxy_cache_zone}使用此处指定的名称
    					proxy_cache_key $host$request_uri; # 定义缓存的key,根据md5值为缓存文件名
    					proxy_cache_valid 200 302 10m; # 为不同状态码设置缓存时间
    					proxy_cache_valid 301 1d;
    					proxy_cache_valid any 1m;
    					add_header X-Cache $upstream_cache_status; # 添加响应头,测试是否命中
    					expires 30d;
    				}
    			}
    			
    			vi /etc/nginx/conf.d/solo.aliangedu.com.conf    #java项目代理缓存
    			server {
    				listen 80;
    				server_name solo.aliangedu.com;
    				access_log /var/log/nginx/solo.access.log main;
    				location / {
    					proxy_pass http://dynamic.solo;
    				}
    				location ~ .(html|css|js|jpg|png|gif)$ {
    					proxy_pass http://static.solo;
    					proxy_cache proxy_cache_zone;
    					proxy_cache_key $host$request_uri;
    					proxy_cache_valid 200 302 10m;
    					proxy_cache_valid 301 1d;
    					proxy_cache_valid any 1m;
    					add_header X-Cache $upstream_cache_status;
    					expires 30d;
    				}
    			}
    			
    			查看缓存目录
    			ls /usr/local/nginx/proxy_cache   #缓存目录根据自己情况创建
    			
    			
    	4.2PHP项目
    		每访问一次.php文件,php就会编译一次。
    		
    		PHP缓冲器:将编译的缓存起来,二次访问直接从缓存中读取。
    			打开后能提高2-3倍的速度。
    			ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
    			
    			vi /usr/local/php/etc/php.ini
    				opcache.enable=1   1表示启用,启用
    				opcache.memory_consumption=512   代码缓存内存大小。修改大小。
    				
    				;   extension=/path/to/extension/msql.so
    				zend_extension=opcache.so   添加。
    		
    		PHP-FPM
    			pm.start_servers 固定进程数量。相当于nginx中的work_proccess 
    			 vi /usr/local/php/etc/php-fpm.conf
    				pm.max_children = 5   默认最大5个进程。根据cpu数量调整。
    				pm.start_servers = 2  启动时,最小启动2个进程。
    				pm.min_spare_servers = 1   最小空闲数
    				pm.max_spare_servers = 3   最大空闲数。
    				pm.process_idle_timeout = 10s;去掉注释。 空闲进程多长时间没有处理请求被kaill掉
    				
    				pm.max_requests = 500去掉注释,一个子进程处理完500个请求后,自动重启进程。为的是释放资源。
    
    			
    
    	4.3JAVA项目
    		https://blog.51cto.com/lizhenliang/1763866  java调优
    		1、增加最大连接数  2、调整工作模式	 3、启用gzip压缩   4、调整JVM内存大小
    		5、作为Web服务器时,与Apache整合或Nginx	 6、合理选择垃圾回收算法 
    		7、尽量使用较新JDK版本
    		Tomcat
    		  vi /root/apache-tomcat-8.5.51/conf/server.xml
    		  
    				<Connector port="8080" protocol="HTTP/1.1"
    						   connectionTimeout="20000"
    						   redirectPort="8443" />
    				
    				<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
    						maxThreads="1000"
    						minSpareThreads="20"
    						maxSpareThreads="100"
    						acceptCount="900"
    						disableUploadTimeout="true"
    						connectionTimeout="20000"
    						URIEncoding="UTF-8"
    						enableLookups="false"
    						redirectPort="8443"
    						compression="on"      #启用压缩
    						compressionMinSize="1024"
    						compressableMimeType="text/html,text/xml,text/css,text/javascript" />
    						   
    						   
    				<!-- A "Connector" using the shared thread pool-->
    				<!--
    				<Connector executor="tomcatThreadPool"
    						   port="8080" protocol="HTTP/1.1"
    						   connectionTimeout="20000"
    						   redirectPort="8443" />
    				-->
    
    		JVM堆内存
    			vi /root/apache-tomcat-8.5.51/bin/catalina.sh
    			JAVA_OPTS="-server -Xms256m -Xmx1024m -XX:+UseConcMarkSweepGC -XX:-PrintGC -XX:-PrintGCDetails -XX:-PrintGCTimeStamps 
    			-Xloggc:../logs/gc.log"
    			说明:
    			-Xms256:最小256,  -Xmx1024m:最大根据项目程序需求反复实验出来。
    							   不是越大越好,3072m, 3G差不多就能跑所有项目了。
    			
    			根据进程查看堆内存
    				ps -ef |grep tomcat
    			
    				jmap -heap 2356
    				
    				Heap Configurateion:看此项。
    
    5.电商网站大并发优化思路
    	5.1 CDN :解决南北通信问题。提高全局链路访问速度。(Squid,varnish)。
    	5.2 OSPF+LVS(FULLNAT实现跨机房负载均衡)。
    	5.3 增加Nginx七层集群量。
    	5.4 Redis Cluster 增加缓存系统。
    	5.5 数据库IO瓶颈,一主多从数据库读写分离,使用固态硬盘,多主多从来分担压力。
    	5.6 业务项目拆分,分而治之。多集群。
    
  • 相关阅读:
    MongDB简单介绍
    Docker的简单介绍
    maven简单介绍
    粗谈Springboot框架,众所周知Springboot是有spring推出的微服务框架,什么是微服务框架呢!
    Springboot打包问题,打包的话是通过
    SpringBoot注解及swagger注解使用及规范
    properties配置
    日志配置
    c++几个面试题
    c++四种强制类型转化的区别
  • 原文地址:https://www.cnblogs.com/qiandong/p/12880294.html
Copyright © 2011-2022 走看看