竹笋

首页 » 问答 » 环境 » 肝了17719字性能调优系列专题JVM
TUhjnbcbe - 2024/10/19 20:49:00
前言

性能调优,无疑是个庞大的话题,也是很多项目中非常重要的一环,性能调优难做是众所周知的,毕竟性能调优涵盖的面实在是太多了,在这里我就大概的讲一下企业中最常用的四种调优——JVM调优、MySQL调优、Nginx调优以及Tomcat调优,一家之言,有什么说的不对的还请多包涵补充。

篇幅所限,有些东西是肯定写不到的,所以本文只是挑了一些重要部分来剖析,如果需要完整详细的掌握性能调优,可以看看我系统整理的性能调优笔记和相关学习资料,转发本文+
  InnoDB会根据以下两个条件检查每行记录:
  
  a.InnoDB只查找版本早于当前事务版本的数据行,这样可以确保事务读取到的数据,要么是在事务开始前就存在的,要么是事务自身插入或更新的
  
  b.行的删除版本要么未定义要么大于当前事务版本号,确保了事务读取到的行,在事务开始前未被删除

至于虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

注:和不可重复读类似,但虚读(幻读)会读到其他事务的插入的数据,导致前后读取不一致

MySQL的Repeatableread隔离级别加上GAP间隙锁已经处理了幻读了。

三、Nginx调优1、Nginx定义

nginx常用做静态内容服务和反向代理服务器,以及页面前端高并发服务器。适合做负载均衡,直面外来请求转发给后面的应用服务(tomcat什么的)

2、熟练掌握Nginx核心配置2.1全局配置块userroot;#运行worker进程的账户,user用户[组],默认以nobody账户运行worker_processes7;#要使用的worker进程数,可设置为数值、auto(根据机器性能自动设置),默认值1error_loglogs/error.log;#nginx进程(master+worker)的日志设置,保存位置、输出级别,此即为默认保存位置#error_loglogs/error.lognotice;#输出级别可选,由低到高依次为:debug(输出信息最多),info,notice,warn,error,erit(输出信息最少)pidlogs/nginx.pid;#nginx主进程的pid的保存位置,此即为默认值worker_rlimit_nofile;#单个worker进程可打开的最大文件描述符数复制代码

**worker_processes:**

实际运营时一般设置为很接近CPU的线程数,比如说CPU是8线程,一般设置为6、7。

我们自己开发、用时一般设置为1、2即可,不然太吃资源。

worker_rlimit_nofile:

r是read,limit是限制,单个worker进程最多只能打开指定个数的文件,超过便不能再读取文件。打开一次文件便会产生一个文件描述符。

此设置是为了防止单个worker进程消耗大量的系统资源。

ps-ef

grepnginx查询下nginx的进程:

不管设置多少个worker进程,主进程只有一个(即运行sbin/nginx)。

主进程由Linux当前登录的账户运行,工作进程由user指令指定的账户运行。第一列数字是进程的PID。

nginx工作进程和nginx主进程都是Linux中的进程,但主进程(父进程)可以控制worker进程(子进程)的开启、结束。

master进程可以看做老板,worker进程可以看做打工仔。

2.2events块events{accept_mutexon;#防止惊群multi_accepton;#允许单个worker进程可同时接收多个网络连接的请求,默认为off useepoll;#设置worker进程使用高效模式worker_connections;#指定单个worker进程最多可建立的网络连接数,默认值。}

accept_mutex:

惊群现象:一个网络连接到来,所有沉睡的worker进程都会被唤醒,但只用一个worker处理连接,其余被唤醒的worker又开始沉睡。

设置为on:要使用几个worker就唤醒几个,不全部唤醒,默认值就是on。

设置为off:一律全部唤醒。一片worker醒来是要占用资源的,会影响性能。

use:

指定nginx的工作模式,可选的值:select、poll、kqueue、epoll、rtsig、/dev/poll。

其中select、poll都是标准模式,kqueue、epoll都是高效模式,

kqueue是在BSD系统中用的,epoll是在Linux系统中用的。(BSD是Unix的一个分支,Linux是一种类Unix系统)。

全局块中的worker_processes、events块中的worker_connections是nginx支持高并发的关键,这2个数值相乘即nginx可建立的最大连接数。

一个连接要用一个文件来保存,

worker_connections设置的单个worker进程的最大连接数,受全局块中worker_rlimit_nofile设置的单个worker进程可打开的最大文件数限制。

而worker_rlimit_nofile只是nginx对单个worker进程的限制,要受Linux系统对单个进程可打开的最大文件描述符数限制。

Linux默认单个进程最多只能打开个文件描述符,需要我们修改下Linux的资源限制,设置单个进程可打开的最大文件描述符数:

ulimit-n

ulimit命令可以限制单个进程使用的系统资源的尺寸、数量,包括内存、缓冲区、套接字、栈、队列、CPU占用时间等。

可用ulimit--help查看参数。

2.3
  access_loglogs/access.log;#设置日志,这个日志保存的是客户端请求的信息,包括客户端地址、使用的浏览器、浏览器内核版本、请求的url、请求时间、请求方式、响应状态等。
  #access_loglogs/access.logmain;#可指定日志格式,上面定义的main格式即默认格式。保存位置默认是logs/access.logsendfileon;#开启文件高效传输模式,默认为off,不开启。#tcp_nopushon;#如果响应体积过大,默认会分多个批次传输给客户端,设置为on会一次性传给客户端,可防止网络阻塞 #tcp_nodelayon;#如果响应体积过小,默认会放在缓冲区,缓冲区满了才刷给客户端,设置为on直接刷给客户端,可防止网络阻塞keepalive_timeout65;#与客户端保持连接的超时时间,在指定时间内,如果客户端没有向Nginx发送任何数据(无活动),Nginx会关闭该连接。gzipon;#使用gzip模块压缩响应数据。启用后响应体积变小,传输到客户端所需时间更少,节省带宽,但nginx压缩、客户端解压都有额外的时间、资源开销,nginx的负担也会加大。upstreamservers{#设置负载均衡器,可同时设置多个负载均衡器。负载均衡器的名称中不能含有_,此处指定名称为serversserver..1.7:;#tomcat服务器节点server..1.8:;server..1.7:down;#down表示该节点下线,暂不使用
  
  server..1.8:backup;#backup表示该节点是备胎,只有在其他节点忙不过来时才会启用(比如一些节点出故障了、其他节点负载变大)。
  
  server..1.8:max_fails=3fail_timeout=60s;#如果对该节点的请求失败3次,就60s内暂时不使用该节点,60s后恢复使用}

日志格式常用的值:

$remote_addr客户端的ip地址

$time_local:访问时间与时区

$request:请求的url与
  
  #server全局块
  
   listen80;#要监听的端口server_namelocalhost;#虚拟主机(即域名),要在dns上注册过才有效,没有注册的话只能用localhost。可指定多个虚拟主机,空格分开即可charsetutf-8;#使用的字符集。#access_loglogs/host.access.logmain;#在
  
  #错误页设置
  
  error_page/.html;#html目录下默认只有index.html(nginx首页)、50x.html,需要自己写.htmllocation=/.html{roothtml;#指定.html所在目录,此处使用相对路径,nginx主目录下的html目录,也可以使用绝对路径}error_page/50x.html;location=/50x.html{roothtml;}
  
  #处理静态资源
  
  location~*\.(html

css

js

gif

jpg

png

mp4)${#使用正则表达式匹配url,如果请求的是这些文件,就使用下面的处理方式rootstatic;#如果使用nginx处理静态资源,需使用root指定静态资源所在目录。在nginx主目录下新建目录static,把静态资源放进去即可。
  
  
   expires30d;#设置缓存过期时间
  
  
   #proxy_pass
  
  
  
  #设置默认处理方式
  
  location/{#如果url没有指定匹配,就使用默认的处理方式来处理roothtml;#指定处理请求的根目录。nginx本身作为web服务器直接处理客户端请求时,比如请求login.jsp,会调用root指定目录下的login来处理请求。indexindex.htmlindex.htm;#指定nginx服务器的首页地址。root、index2项配置都是必需的。proxy_pass
  connectionTimeout="00"redirectPort=""/Connectorport=""protocol="HTTP/1.1"connectionTimeout="00"
  redirectPort=""/Connectorexecutor="tomcatThreadPool"
  port=""protocol="HTTP/1.1"
  connectionTimeout="00"
  redirectPort=""/Connectorexecutor="tomcatThreadPool"
  port=""protocol="org.apache.coyote.
  connectionTimeout="00"
  redirectPort=""/

我们姑且把上面四种Connector按照顺序命名为NIO,HTTP,POOL,NIOP。测试性能对比,数值为每秒处理的请求数,越大效率越高

NIOHTTPPOOL NIOP

得出结论:NIOPNIOPOOLHTTP虽然Tomcat默认的HTTP效率最低,但是根据测试次数可以看出是最稳定的。且这只是一个简单页面测试,具体会根据复杂度有所波动。

配置参考:Linux系统每个进程支持的最大线程数是,windos是0。具体跟服务器的内存,Tomcat配置的数量有关联。

Connectorport=""protocol="org.apache.coyote.maxThreads=""minSpareThreads="25"maxSpareThreads=""enableLookups="false"redirectPort=""acceptCount=""connectionTimeout="00"disableUploadTimeout="true"/3、Tomcat的集群

Tomcat的部署,是一台服务器部署一个Tomcat(上线多个项目),还是一台服务器部署多个tomact(每个tomcat部署1~n个项目)。多核必选配置多个Tomcat,微服务多线程的思想模式。

4、Tomcat内存设置

修改/bin/catalina.sh,增加如下设置:

JAVA_OPTS=-Xms-Xmx

需要把这个两个参数值调大,大小的可以根据服务器内存的大小进行调整。例如:

JAVA_OPTS=-Xmsm–Xmxm

服务器是8G内存,跑了3个tomcat服务,给分配了2G的内存,因为还有其他进程。

本篇文章写到这里差不多就结束了,当然也有很多东西还没有写到,不过限于篇幅也是没辙,我整理了很详细的JVM、MySQL、NGINX和Tomcat的学习笔记以及资料,需要的朋友直接转发本文+

1
查看完整版本: 肝了17719字性能调优系列专题JVM