建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块

正品猫粮

发帖: 8粉丝: 0

级别 : 版主

Rank: 7Rank: 7Rank: 7

发消息 + 关注

发表于7 天前 71 1 楼主 显示全部楼层
[WEB] Tomcat 调优指南(鲲鹏920)

1 调优概述

1.1 Tomcat介绍

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试

JSP 程序的首选。

Tomcat性能调优从大的方面来说,在系统设计之初,需要考虑硬件的选择,操作系统的选择,基础软件的选择。从小的方面来说,包括每个子系统的设计,算法选择,如何使用编译器的选项,如何发挥硬件最大的性能等等。

1.2 调优原则

在性能优化时,我们必须遵循一定的原则,否则,有可能得不到正确的调优结果。主要有以下几个方面:

  • 对性能进行分析时,要多方面分析系统的资源瓶颈所在,因为系统某一方面性能低,也许并不是它自己造成的,而是其他方面造成的。如CPU利用率是100%时,很可能是内存容量太小,因为CPU忙于处理内存调度。

  • 一次只对影响性能的某方面的一个参数进行调整,多个参数同时调整的话,很难界定性能的影响是由哪个参数造成的。

  • 由于在进行系统性能分析时,性能分析工具本身会占用一定的系统资源,如CPU资源、内存资源等等。我们必须注意到这点,即分析工具本身运行可能会导致系统某方面的资源瓶颈情况更加严重。

1.3 调优思路

性能调优首要要发现问题,找到性能瓶颈点,然后根据瓶颈所处层级选择优化的方法,下图介绍了Tomcat的调优思路。

调优思路.jpg

调优分析思路如下:

  1. 对于服务端的问题,需要重点定位的硬件指标包括CPU、内存、硬盘、BIOS配置,其中CPU是需要重点关注的:服务端CPU未压满或存在明显热点函数直接影响最终测试结果;需要重点关注的软件指标包括应用软件、OS层的优化,该部分的调优对于性能的提升是很可观的。

  2. 对于网络问题,需要重点定位的包括网络带宽和网络中断,处理网络中断的核是否压满是需要重点关注的,http长连接场景需要重点关注网络带宽是否达到瓶颈。

  3. 对于客户端问题:客户端的性能是否满足测试需要,尤其对于http短连接场景。


2 硬件调优

2.1 配置BIOS

目的

对于不同的硬件设备,通过在BIOS中设置一些高级选项,可以有效提升服务器性能。

  • 服务器上的SMMU一般用来完成设备的地址转换,并且可以实现设备隔离,在虚拟化中很实用,但是在物理机测试场景下,SMMU可能会导致性能下降,尤其对于小包网络场景,因此建议关闭该功能提升服务器性能。在虚拟机场景需要打开此配置来使用PCI直通功能。

  • 在本测试场景中,预取会导致cache污染,cache miss增加,因此建议关闭预取功能。

方法

步骤 1 关闭SMMU。

   方法一:

               1.         重启服务器,按Esc键进入BIOS设置界面。

               2.         依次进入“Advanced > MISC Config >  > Support Smmu”。

               3.         将“Support Smmu”设置为“Disabled”,按“F10”保存退出(永久有效)。


   方法二:

               1.         执行vim /etc/grub2-efi.cfg命令。

               2.         搜索字段"4.14",在内核代码中加入"iommu.passthrough=1"

af6b8bec-5c63-407b-b87c-344765ebfee9.png

               3.      保存退出后,重启服务器。


步骤 2  关闭预取

      1. 进入BIOS设置界面。

      2. 依次进入“Advanced > MISC Config > CPU Prefetch”。

      3. 将“CPU Prefetch”设置为“Disabled”,按“F10”保存退出(永久有效)。


3 操作系统调优

3.1 配置扩展文件描述符

目的

在Nginx环境中,需要配置最大打开文件数为102400,否则在测试过程中可能会导致软件最大打开文件数被限制在1024,影响服务器性能。

方法

步骤 1  在"/etc/security/limits.conf"文件中写入以下配置。

        *   soft     nofile      102400
        *   hard     nofile      102400

                其中:*表示所有用户;hard表示严格的设定,必定不能超过这个设定的数值;soft表示警告的设定,可以超过这个设定值,但是若超过则有警告信息。

步骤 2  保存文件并重启服务器。

3.2 配置内核参数

目的

对于不同的操作系统,通过调优内核参数,可以有效的提高服务器的性能。

方法

步骤1 执行vim /etc/sysctl.conf命令,并输入下列内核参数:

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 1024    65500
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 262144
net.core.netdev_max_backlog = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
                       

内核参数说明如下表所示:

linux参数

参数定义

当前值

默认值

net.ipv4.tcp_tw_reuse

1表示允许将TIME-WAIT sockets重新用于新的TCP连接,0表示关闭。

1

0

net.ipv4.tcp_keepalive_time

TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效

60

7200

net.ipv4.tcp_fin_timeout

socket 保持在 FIN_WAIT_2 状态的最大时间

1

60

net.ipv4.tcp_max_tw_buckets

减少TIME_WAIT连接数,避免过多TIME_WAIT连接占用网络资源导致新建连接资源紧张,时延增加

5000

262144

net.ipv4.ip_local_port_range

增加可用端口范围,避免大量连接占用端口时,新建连接不断寻找可用端口导致的性能跳水

1024 65500

32768 61000

net.core.somaxconn

定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数

65535

128

net.ipv4.tcp_max_syn_backlog

表示SYN队列的长度,加大队列长度可以容纳更多等待连接的网络连接

262144

1024

net.core.netdev_max_backlog

当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目

262144

1000

net.core.rmem_max

系统套接字读最大缓冲区

16777216

131071

net.core.wmem_max

系统套接字写最大缓冲区,增加buffer大小,避免大量新建连接导致buffer溢出,出现无法建立连接情况

16777216

131071

net.nf_conntrack_max

最大跟踪连接数

0

65536

     

    

            当使用容器时,由于不能关闭nf_conntrack模块,所以需要在内核参数中增加nf_conntrack相关设置,防止table记录满产生丢包问题。

            在/etc/sysctl.conf文件中还需添加如下内核参数

        net.netfilter.nf_conntrack_max=0

步骤2  写入参数后保存配置文件

步骤3  执行命令以生效配置:

            /sbin/sysctl -p

3.3 关闭nf_conntrack模块

            使用容器的场景不能做本章节的操作。

目的

内核的nf_conntrack模块可以用来实现NAT,但是在没有使用NAT的场景,开启nf_conntrack模块会导致不需要的CPU消耗,甚至可能导致table记录满产生丢包问题,因此可以考虑关闭nf_conntrack模块提升性能。

方法

步骤1  在"/etc/modprobe.d/blacklist.conf"文件中加入如下参数:

install nf_conntrack /bin/false
blacklist nf_conntrack
blacklist nf_conntrack_ipv6
blacklist xt_conntrack
blacklist nf_conntrack_ftp
blacklist xt_state
blacklist iptable_nat
blacklist ipt_REDIRECT
blacklist nf_nat
blacklist nf_conntrack_ipv4

步骤2  保存文件后,重启服务器使文件生效。

3.4 关闭selinux

目的

为了减少selinux的性能损耗,本文关闭selinux。

方法

步骤1  执行命令,打开selinux文件。

     vim /etc/sysconfig/selinux

步骤2  将"SELINUX=enforcing" 改为 "SELINUX=disabled"。

80143299-549c-4ef8-a180-4e985cd969b9.png

步骤3  保存文件,并重启服务器。


步骤4  执行如下语句确认selinux是否关闭,如果SELinux status参数显示为disabled即为关闭状态。

        /etc/sysctl.conf/usr/sbin/sestatus -v

3.5 配置网卡中断绑核

目的


    1. 每个CPU对应一个网卡,每个CPU内的中断绑核只绑在属于本CPU的网卡上,按node各自绑核。

    2. 中断个数在尽量少的情况下满足当前所有业务core在客户端满压下满CPU运作即可。

方法


步骤 1 关闭irqbalance。

           若要对网卡进行绑核操纵,需要关闭irqbalance。

        1. 关闭irqbalance服务,重启失效。

            systemctl stop irqbalance.service

        2. 停止irqbalance服务,永久有效。       

            systemctl disable irqbalance.service

        3. 查看irqbalance服务状态是否已关闭。   

            systemctl status irqbalance.service


步骤 2  配置网卡中断绑核           

            网卡中断绑核,绑定的核专门用于处理网卡中断。

        1. 设置队列深度为CPU的核数

       ethtool -L $eth1 combined $cnt

        2. 查询中断号           

      cat /proc/interrupts | grep $eth1 | awk -F ':' '{print $1}'

        3. 根据中断号,将每个中断各绑定在一个核上。

   echo $cpunum > /proc/irq/$irq/smp_affinity_list

绑核脚本示例

虚拟机

虚拟机采用网卡直通的模式,每个虚拟机配置一个虚拟网口,在虚拟机内部执行绑核脚本。以4core的http短连接场景的绑核脚本为例,脚本内容如下,若要修改绑核脚本,只需修改要绑定的网口eth1,以及要绑定的core,在关闭irqbalance.service的情况下使用脚本即可。

#!/bin/bash
cnt=2
eth1=enp5s0
ethtool -L $eth1 combined $cnt
irq1=`cat /proc/interrupts| grep -E ${eth1} | head -1 | awk -F ':' '{print $1}'`
irq1=`echo $irq1`
i=0
while(( $i < 2))
do
    for cpunum in  3
    do
        echo $cpunum "->" $irq1
        echo  $cpunum > /proc/irq/$irq1/smp_affinity_list
        let "irq1++"
    done
  let "i++"
done

参数说明:

表1 参数说明

参数名称

参数解释

cnt

网口队列数

eth1

通信中使用的网口名

irq1

网口eth1对应的中断号

cpumun

分配给网口eth1用于处理网卡中断的核

容器

容器与物理机共享网口,在物理机上执行绑核脚本。以4core的http短连接场景的绑核脚本为例,脚本内容如下,如果要修改绑核脚本,只需修改要绑定的网口名eth1,以及要绑定的core,然后在关闭irqbalance.service的情况下使用脚本即可:

#!/bin/bash
cnt=2
eth1=enp3s0
ethtool -L $eth1 combined $cntirq1=`cat /proc/interrupts| grep -E ${eth1} | head -1 | awk -F ':' '{print $1}'`
irq1=`echo $irq1`
i=0
while(( $i < 1))
do
    for cpunum in 2 3
    do
        echo $cpunum "->" $irq1
        echo  $cpunum > /proc/irq/$irq1/smp_affinity_list
        let "irq1++"
    done
   let "i++"
done

4 Tomcat调优

目的

通过调优Tomcat的配置文件及绑核,可以有效的提高服务器的性能。

方法

    步骤 1 配置服务器文件。

    按照如下所示信息,配置server.xml的各个参数。

    

    步骤 2 Tomcat启动添加taskset。

        taskset -c N ./ startup.sh



举报
分享

分享文章到朋友圈

分享文章到微博

阿奇@汪汪...

发帖: 8粉丝: 2

级别 : 版主

Rank: 7Rank: 7Rank: 7

发消息 + 关注

发表于7 天前 沙发 显示全部楼层

点赞 回复 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册