史上最强 Tomcat8 性能优化实战!-程序员宅基地

作者:ThinkWon

链接:blog.csdn.net/ThinkWon/java/article/details/102744033

文章目录

  • 目的

  • 服务器资源

  • Tomcat配置优化

        Linux环境安装运行Tomcat8

            AJP连接

            执行器(线程池)

            3种运行模式

  • 部署测试用的web项目

            查看服务器信息

            部署web应用

            使用Apache JMeter进行性能测试

                下载安装

                修改语言

                创建接口的测试用例

                启动与进行接口测试

                查看测试报告

  • 调整Tomcat参数进行优化

            禁用AJP连接

            设置线程池

                最大线程数为150,初始为4

                最大线程数为500,初始为50

                最大线程数为1000,初始为200

                最大线程数为5000,初始为1000

                设置最大等待队列数

            设置nio2的运行模式

            参数说明与最佳实践

                执行器参数说明(加粗是重点)

                执行器最佳实践

                连接器参数说明

                    通用属性(加粗是重点)

                    标准实现(加粗是重点)

                连接器最佳实践

  • 调整JVM参数进行优化

            设置并行垃圾回收器

            查看gc日志文件

            调整年轻代大小

            设置G1垃圾回收器

            JVM配置最佳实践

  • 总结

本博客的目的不在于给出最佳配置,而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数。

目的

通过Tomcat性能优化可以提高网站的并发能力。

Tomcat服务器在JavaEE项目中使用率非常高,所以在生产环境对Tomcat的优化也变得非常重要了。

对于Tomcat的优化,主要是从2个方面入手,一是Tomcat自身的配置,另一个是Tomcat所运行的jvm虚拟机的调优。

服务器资源

服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。硬件我们不说了,这个方面是钱越多越好是吧。

Tomcat配置优化

Linux环境安装运行Tomcat8

如果需要登录系统,必须配置tomcat用户,在安装完Tomcat后,进行如下操作

在/conf/tomcat-users.xml文件中的标签里面添加如下内容

<!-- 修改配置文件,配置tomcat的管理用户 -->
<role rolename=manager/>
<role rolename=manager-gui/>
<role rolename=admin/>
<role rolename=admin-gui/>
<user username=tomcat password=tomcat roles=admin-gui,admin,manager-gui,manager/>

如果是tomcat7,配置了tomcat用户就可以登录系统了,但是tomcat8中不行,还需要修改另一个配置文件,否则访问不了,提示403,打开webapps/manager/META-INF/context.xml文件

<!-- 将Valve标签的内容注释掉,保存退出即可 -->
<?xml version=1.0 encoding=UTF-8?>

<Context antiResourceLocking=false privileged=true >
  <!--<Valve className=org.apache.catalina.valves.RemoteAddrValve
         allow=127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1 />-->
  <Manager sessionAttributeValueClassNameFilter=java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap/>
</Context>

打开浏览器进行访问10.172.0.202:8080

点击“Server Status”,输入用户名、密码进行登录,tomcat/tomcat

登录之后可以看到服务器状态等信息,主要包括服务器信息,JVM,ajp和http信息

AJP连接

在服务状态页面中可以看到,默认状态下会启用AJP服务,并且占用8009端口。

什么是AJP

AJP(Apache JServer Protocol)

AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。

我们一般是使用Nginx+Tomcat的架构,所以用不着AJP协议,把AJP连接器禁用。

修改conf下的server.xml文件,将AJP服务禁用掉即可。

<!-- 禁用AJP连接 -->
<!-- <Connector port=8009 protocol=AJP/1.3 redirectPort=8443 /> -->

重启tomcat,查看效果。可以看到AJP服务已经不存在了。

执行器(线程池)

在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能。

修改server.xml文件:

<!--将注释打开-->
<Executor name=tomcatThreadPool namePrefix=catalina-exec-
        maxThreads=500 minSpareThreads=50 prestartminSpareThreads=true maxQueueSize=100/>

<!--
参数说明:
maxThreads:最大并发数,默认设置 200,一般建议在 500 ~ 1000,根据硬件设施和业务来判断
minSpareThreads:Tomcat 初始化时创建的线程数,默认设置 25
prestartminSpareThreads:在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就没啥效果了
maxQueueSize,最大的等待队列数,超过则拒绝请求
-->

<!--在Connector中设置executor属性指向上面的执行器-->
<Connector executor=tomcatThreadPool port=8080 protocol=HTTP/1.1
               connectionTimeout=20000
               redirectPort=8443 />

保存退出,重启tomcat,查看效果。

在页面中显示最大线程数为-1,这个是正常的,仅仅是显示的问题,实际使用的是指定的值。如果配置了一个Executor,则该属性的任何值将被正确记录,但是它将被显示为-1。

3种运行模式

tomcat的运行模式有3种:

bio

性能非常低下,没有经过任何优化处理和支持

nio

nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。Tomcat8默认使用nio运行模式。

apr

安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能

对于每种协议,Tomcat都提供了对应的I/O方式的实现,而且Tomcat官方还提供了在每种协议下每种I/O实现方案的差异, HTTP协议下的处理方式如下表,详情可查看Tomcat官网说明

推荐使用nio,在tomcat8中有最新的nio2,速度更快,建议使用nio2

设置nio2:

<Connector executor=tomcatThreadPool  port=8080 protocol=org.apache.coyote.http11.Http11Nio2Protocol
               connectionTimeout=20000
               redirectPort=8443 />

可以看到已经设置为nio2了。

部署测试用的web项目

为了方便测试性能,我们将部署一个java web项目,这个项目本身和本博客没有什么关系,仅仅用于测试。

注意:这里在测试时,我们使用一个新的tomcat,进行测试,后面再对其进行优化调整,再测试。

查看服务器信息

说明一下我的测试服务器配置,不同的服务器配置对Tomcat的性能会有所影响。

CentOS7服务器环境信息查看命令

查看Linux版本

查看Linux版本:cat /etc/centos-release

查看CPU个数

查看逻辑cpu个数:cat /proc/cpuinfo | grep “processor” | wc -l

查看物理cpu个数:cat /proc/cpuinfo | grep “physical id” | sort | uniq | wc -l

查看每个物理cpu的核数cores:cat /proc/cpuinfo | grep “cpu cores”

如果所有物理cpu的cores个数加起来小于逻辑cpu的个数,则该cpu使用了超线程技术。查看每个物理cpu中逻辑cpu的个数:cat /proc/cpuinfo | grep “siblings”

查看内存使用情况

查看内存占用情况:free -m

参数说明

Mem:内存的使用情况总览表。

total:机器总的物理内存 单位为:M

used:用掉的内存。

free:空闲的物理内存。

[root@localhost ~]# cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core)

[root@localhost ~]# cat /proc/cpuinfo | grep processor | wc -l
4
[root@localhost ~]# cat /proc/cpuinfo | grep physical id | sort | uniq | wc -l
4

[root@localhost ~]# cat /proc/cpuinfo | grep cpu cores
cpu cores : 1
cpu cores : 1
cpu cores : 1
cpu cores : 1

[root@localhost ~]# free -m
              total used free shared buff/cache available
Mem: 7825         850        6241           9         733        6714
Swap: 8063           0        8063

部署web应用

上传war包到linux服务器,然后进行部署

我的web应用的名字叫tomcat-optimization,主要是提供了一个查询用户列表的接口,该接口会去阿里云数据库查询用户列表,没有任务业务逻辑的处理。

# 删除tomcat的/webapps/ROOT目录的所有文件
cd /webapps/ROOT
rm -rf *

# 上传war包到tomcat的/webapps/ROOT,然后解压
jar -xvf tomcat-optimization.war
rm -rf tomcat-optimization.war

# 进入tomcat的/bin目录重启tomcat
cd /bin
./shutdown.sh
./startup.sh

访问接口地址:http://10.172.0.202:8080/user/listUser

[{
  id: 1,
  account: lilei,
  password: 123456,
  userName: 李雷,
  gender: 1,
  age: 15,
  birthday: 2001-01-01 01:01:38,
  createTime: 2016-03-01 19:09:55
}, {
  id: 2,
  account: hanmeimei,
  password: 123456,
  userName: 韩梅梅,
  gender: 0,
  age: 14,
  birthday: 2002-01-01 01:01:38,
  createTime: 2016-03-01 19:09:55
}, {
  id: 3,
  account: lucy,
  password: 123456,
  userName: 露西,
  gender: 0,
  age: 13,
  birthday: 2003-01-01 01:01:38,
  createTime: 2016-03-01 19:09:55
}]

使用Apache JMeter进行性能测试

Apache JMeter是Apache组织开发的基于Java的压力测试工具。我们借助于此工具进行测试,将测试出tomcat的吞吐量等信息。

下载安装

下载地址:http://jmeter.apache.org/download_jmeter.cgi

注意:这里需要先安装好jdk8及其以上版本的环境,可以参考JDK安装与环境变量配置

直接将下载好的zip压缩包进行解压即可。

进入bin目录,找到jmeter.bat文件,双机打开即可启动。

JMeter启动页面

JMeter主页面

修改语言

默认的主题是黑色风格的主题并且语言是英语,这样不太方便使用,所以需要修改下语言。

设置语言为简体中文。

修改语言完成的界面

创建接口的测试用例

测试接口之前需要调整Windows环境配置,不然会报如下错误

JMeter java.net.BindException: Address already in use: connect

出现原因:

TCP/IP连接数不够或TIME_WAIT中存在很多链接,导致吞吐量低。

解决方案:

从问题的原因分析,有两种解决方案,一是增加预留给TCP/IP服务的临时端口的数量,二是加快被占用端口的释放速度。

解决办法:

1、打开注册表:regedit

2、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters

3、新建 DWORD值,name:TCPTimedWaitDelay,value:30(十进制) –> 设置为30秒,默认是240秒

4、新建 DWORD值,name:MaxUserPort,value:65534(十进制) –> 设置最大连接数65534

5、重启系统

第一步:设置测试计划的名称

第二步:添加线程组,使用线程模拟用户的并发

1000个线程,每个线程循环10次,也就是tomcat会接收到10000个请求。

第三步:添加http请求

设置http请求

第四步:添加请求监控

启动与进行接口测试

查看测试报告

在聚合报告中,重点看吞吐量。

调整Tomcat参数进行优化

通过上面测试可以看出,tomcat在不做任何调整时,吞吐量为697次/秒。这个吞吐量跟接口的业务逻辑关系很大,如果业务逻辑复杂,需要比较长时间计算的,可能吞吐量只有几十次/秒,我这里测试的时候没有添加任务业务逻辑,才会出现吞吐量为697次/秒的情况。这里的吞吐量最好是经过多次测试取平均值,因为单次测试具有一定的随机性

禁用AJP连接

修改conf下的server.xml文件,将AJP服务禁用掉即可。

<!-- <Connector port=8009 protocol=AJP/1.3 redirectPort=8443 /> -->

这里经过9次测试,测试结果如下704 730 736 728 730 727 714 708 735 平均是723

可以看到,禁用AJP服务后,吞吐量会有所提升。

当然了,测试不一定准确,需要多测试几次才能看出是否有提升。

设置线程池

通过设置线程池,调整线程池相关的参数进行测试tomcat的性能。有关线程池更多更详细的配置参考Tomcat官网提供的配置详解

最大线程数为150,初始为4

<Executor name=tomcatThreadPool namePrefix=catalina-exec-
        maxThreads=150 minSpareThreads=4 prestartminSpareThreads=true/>

<!--在Connector中设置executor属性指向上面的执行器-->
<Connector executor=tomcatThreadPool port=8080 protocol=HTTP/1.1
               connectionTimeout=20000
               redirectPort=8443 />

经过9次测试,测试结果如下705 725 702 729 733 738 735 728 平均是724

最大线程数为500,初始为50

<Executor name=tomcatThreadPool namePrefix=catalina-exec-
        maxThreads=500 minSpareThreads=50 prestartminSpareThreads=true/>

<!--在Connector中设置executor属性指向上面的执行器-->
<Connector executor=tomcatThreadPool port=8080 protocol=HTTP/1.1
               connectionTimeout=20000
               redirectPort=8443 />

测试结果:733 724 718 728 734 721 720 723 平均725

吞吐量为725次/秒,性能有所提升。

最大线程数为1000,初始为200

<Executor name=tomcatThreadPool namePrefix=catalina-exec-
        maxThreads=1000 minSpareThreads=200 prestartminSpareThreads=true/>

<!--在Connector中设置executor属性指向上面的执行器-->
<Connector executor=tomcatThreadPool port=8080 protocol=HTTP/1.1
               connectionTimeout=20000
               redirectPort=8443 />

吞吐量为732,性能有所提升。

测试结果 737 729 730 738 735 726 725 740 平均732

最大线程数为5000,初始为1000

是否是线程数最多,速度越快呢?我们来测试下。

<Executor name=tomcatThreadPool namePrefix=catalina-exec-
        maxThreads=5000 minSpareThreads=1000 prestartminSpareThreads=true/>

<!--在Connector中设置executor属性指向上面的执行器-->
<Connector executor=tomcatThreadPool port=8080 protocol=HTTP/1.1
               connectionTimeout=20000
               redirectPort=8443 />

测试结果 727 733 728 725 738 729 737 735 739 平均732

可以看到,虽然最大线程已经设置到5000,但是实际测试效果并不理想,并且平均的响应时间也边长了,所以单纯靠提升线程数量是不能一直得到性能提升的。

设置最大等待队列数

默认情况下,请求发送到tomcat,如果tomcat正忙,那么该请求会一直等待。这样虽然可以保证每个请求都能请求到,但是请求时间就会边长。

有些时候,我们也不一定要求请求一定等待,可以设置最大等待队列大小,如果超过就不等待了。这样虽然有些请求是失败的,但是请求时间会虽短。典型的应用:12306。

<!--最大等待数为100-->
<Executor name=tomcatThreadPool namePrefix=catalina-exec-
        maxThreads=500 minSpareThreads=100 prestartminSpareThreads=true maxQueueSize=100/>

<!--在Connector中设置executor属性指向上面的执行器-->
<Connector executor=tomcatThreadPool port=8080 protocol=HTTP/1.1
               connectionTimeout=20000
               redirectPort=8443 />

测试结果:

  • 平均响应时间:0.438秒,响应时间明显缩短

  • 错误率:43.07%,错误率超过40%,也可以理解,最大线程为500,测试的并发为1000

  • 吞吐量:1359次/秒,吞吐量明显提升

结论:响应时间、吞吐量这2个指标需要找到平衡才能达到更好的性能。

设置nio2的运行模式

将最大线程设置为500进行测试:

<Executor name=tomcatThreadPool namePrefix=catalina-exec-
        maxThreads=500 minSpareThreads=100 prestartminSpareThreads=true/>

<!-- 设置nio2 -->
<Connector executor=tomcatThreadPool port=8080 protocol=org.apache.coyote.http11.Http11Nio2Protocol
               connectionTimeout=20000
               redirectPort=8443 />

从测试结果可以看到,平均响应时间有缩短,吞吐量有提升,可以得出结论:nio2的性能要高于nio。

参数说明与最佳实践

具体参数参考官网说明

执行器参数说明(加粗是重点)

执行器最佳实践

此最佳配置仅供参考

<Executor name=tomcatThreadPool namePrefix=catalina-exec-
        maxThreads=800 minSpareThreads=100 maxQueueSize=100                                 prestartminSpareThreads=true/>

连接器参数说明

可以看到除了这几个基本配置外并无特殊功能,所以我们需要对 Connector 进行扩展。

其中Connector 支持参数属性可以参考Tomcat官方网站,本文就只介绍些常用的。

通用属性(加粗是重点)

标准实现(加粗是重点)

除了上面列出的常见的连接器属性,标准的HTTP连接器(BIO,NIO和APR/native)都支持以下属性。

连接器最佳实践

此最佳配置仅供参考

<Connector executor=tomcatThreadPool port=8080                                         protocol=org.apache.coyote.http11.Http11Nio2Protocol 
           connectionTimeout=20000 redirectPort=8443 
           enableLookups=false maxPostSize=10485760 URIEncoding=UTF-8                       acceptCount=100 acceptorThreadCount=2 disableUploadTimeout=true                    maxConnections=10000 SSLEnabled=false/>

调整JVM参数进行优化

接下来,通过设置jvm参数进行优化,为了测试一致性,依然将最大线程数设置为500,启用nio2运行模式

设置并行垃圾回收器

在/bin/catalina.sh文件第一行添加如下参数,gc日志输出到/logs/gc.log

#年轻代、老年代均使用并行收集器,初始堆内存64M,最大堆内存512M
JAVA_OPTS=-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms64m -Xmx512m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log

测试结果与默认的JVM参数结果接近。

查看gc日志文件

将gc.log文件上传到gceasy.io查看gc中是否存在问题。上传文件后需要等待一段时间,需要耐心等待。

问题一:系统所消耗的时间大于用户时间

如果在报告中显示System Time greater than User Time,系统所消耗的时间大于用户时间,这反应出的服务器的性能存在瓶颈,调度CPU等资源所消耗的时间要长一些。

问题二:线程暂停时间有点长

可以关键指标中可以看出,吞吐量表现不错,但是gc时,线程的暂停时间稍有点长。

问题三:GC总次数过多

通过GC的统计可以看出:

  • 年轻代的gc有100次,次数有点多,说明年轻代设置的大小不合适,需要调整

  • FullGC有7次,说明堆内存的大小不合适,需要调整

问题四:年轻代内存不足导致GC

从GC原因的可以看出,年轻代大小设置不合理,导致了多次GC。

调整年轻代大小

调整jvm配置参数

JAVA_OPTS=-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms128m -Xmx1024m -XX:NewSize=64m -XX:MaxNewSize=256m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log

将初始堆大小设置为128m,最大为1024m,初始年轻代大小64m,年轻代最大256m

从测试结果来看,吞吐量以及响应时间均有提升。

查看gc日志

可以看到GC次数要明显减少,说明调整是有效的。

GC次数有所减少

设置G1垃圾回收器

#设置了最大停顿时间100毫秒,初始堆内存128m,最大堆内存1024m
JAVA_OPTS=-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms128m -Xmx1024m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log

测试结果

可以看到,吞吐量有所提升,评价响应时间也有所缩短。

G1集合阶段统计

JVM配置最佳实践

此最佳配置仅供参考

JAVA_OPTS=-Dfile.encoding=UTF-8-server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10-XX:NewRatio=2 -XX:+DisableExplicitGC

参数说明:

file.encoding 默认文件编码

-Xmx1024m 设置JVM最大可用内存为1024MB

-Xms1024m 设置JVM最小内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-XX:NewSize 设置年轻代大小

-XX:MaxNewSize 设置最大的年轻代大小

-XX:PermSize 设置永久代大小

-XX:MaxPermSize 设置最大永久代大小

-XX:NewRatio=4 设置年轻代(包括Eden和两个Survivor区)与终身代的比值(除去永久代)。设置为4,则年轻代与终身代所占比值为1:4,年轻代占整个堆栈的1/5

-XX:MaxTenuringThreshold=0 设置垃圾最大年龄,默认为:15。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

-XX:+DisableExplicitGC 这个将会忽略手动调用GC的代码使得System.gc()的调用就会变成一个空调用,完全不会触发任何GC。

总结

通过上述的测试,可以总结出,对tomcat性能优化就是需要不断的进行调整参数,然后测试结果,可能会调优也可能会调差,这时就需要借助于gc的可视化工具来看gc的情况。再帮我我们做出决策应该调整哪些参数。

再次重申本博客的目的不在于给出最佳配置,而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数

END

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45727359/article/details/106561650

智能推荐

Spring Boot 获取 bean 的 3 种方式!还有谁不会?,Java面试官_springboot2.7获取bean-程序员宅基地

文章浏览阅读1.2k次,点赞35次,收藏18次。AutowiredPostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。此方法必须在将类放入服务之前调用。支持依赖关系注入的所有类都必须支持此注释。即使类没有请求注入任何资源,用 PostConstruct 注释的方法也必须被调用。只有一个方法可以用此注释进行注释。_springboot2.7获取bean

Logistic Regression Java程序_logisticregression java-程序员宅基地

文章浏览阅读2.1k次。理论介绍 节点定义package logistic;public class Instance { public int label; public double[] x; public Instance(){} public Instance(int label,double[] x){ this.label = label; th_logisticregression java

linux文件误删除该如何恢复?,2024年最新Linux运维开发知识点-程序员宅基地

文章浏览阅读981次,点赞21次,收藏18次。本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。下面我们来进行文件的恢复,执行下文中的lsof命令,在其返回结果中我们可以看到test-recovery.txt (deleted)被删除了,但是其存在一个进程tail使用它,tail进程的进程编号是1535。我们看到文件名为3的文件,就是我们刚刚“误删除”的文件,所以我们使用下面的cp命令把它恢复回去。命令进入该进程的文件目录下,1535是tail进程的进程id,这个文件目录里包含了若干该进程正在打开使用的文件。

流媒体协议之RTMP详解-程序员宅基地

文章浏览阅读10w+次,点赞12次,收藏72次。RTMP(Real Time Messaging Protocol)实时消息传输协议是Adobe公司提出得一种媒体流传输协议,其提供了一个双向得通道消息服务,意图在通信端之间传递带有时间信息得视频、音频和数据消息流,其通过对不同类型得消息分配不同得优先级,进而在网传能力限制下确定各种消息得传输次序。_rtmp

微型计算机2017年12月下,2017年12月计算机一级MSOffice考试习题(二)-程序员宅基地

文章浏览阅读64次。2017年12月的计算机等级考试将要来临!出国留学网为考生们整理了2017年12月计算机一级MSOffice考试习题,希望能帮到大家,想了解更多计算机等级考试消息,请关注我们,我们会第一时间更新。2017年12月计算机一级MSOffice考试习题(二)一、单选题1). 计算机最主要的工作特点是( )。A.存储程序与自动控制B.高速度与高精度C.可靠性与可用性D.有记忆能力正确答案:A答案解析:计算...

20210415web渗透学习之Mysqludf提权(二)(胃肠炎住院期间转)_the provided input file '/usr/share/metasploit-fra-程序员宅基地

文章浏览阅读356次。在学MYSQL的时候刚刚好看到了这个提权,很久之前用过别人现成的,但是一直时间没去细想, 这次就自己复现学习下。 0x00 UDF 什么是UDF? UDF (user defined function),即用户自定义函数。是通过添加新函数,对MySQL的功能进行扩充,就像使..._the provided input file '/usr/share/metasploit-framework/data/exploits/mysql

随便推点

webService详细-程序员宅基地

文章浏览阅读3.1w次,点赞71次,收藏485次。webService一 WebService概述1.1 WebService是什么WebService是一种跨编程语言和跨操作系统平台的远程调用技术。Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准...

Retrofit(2.0)入门小错误 -- Could not locate ResponseBody xxx Tried: * retrofit.BuiltInConverters_已添加addconverterfactory 但是 could not locate respons-程序员宅基地

文章浏览阅读1w次。前言照例给出官网:Retrofit官网其实大家学习的时候,完全可以按照官网Introduction,自己写一个例子来运行。但是百密一疏,官网可能忘记添加了一句非常重要的话,导致你可能出现如下错误:Could not locate ResponseBody converter错误信息:Caused by: java.lang.IllegalArgumentException: Could not l_已添加addconverterfactory 但是 could not locate responsebody converter

一套键鼠控制Windows+Linux——Synergy在Windows10和Ubuntu18.04共控的实践_linux 18.04 synergy-程序员宅基地

文章浏览阅读1k次。一套键鼠控制Windows+Linux——Synergy在Windows10和Ubuntu18.04共控的实践Synergy简介准备工作(重要)Windows服务端配置Ubuntu客户端配置配置开机启动Synergy简介Synergy能够通过IP地址实现一套键鼠对多系统、多终端进行控制,免去了对不同终端操作时频繁切换键鼠的麻烦,可跨平台使用,拥有Linux、MacOS、Windows多个版本。Synergy应用分服务端和客户端,服务端即主控端,Synergy会共享连接服务端的键鼠给客户端终端使用。本文_linux 18.04 synergy

nacos集成seata1.4.0注意事项_seata1.4.0 +nacos 集成-程序员宅基地

文章浏览阅读374次。写demo的时候遇到了很多问题,记录一下。安装nacos1.4.0配置mysql数据库,新建nacos_config数据库,并根据初始化脚本新建表,使配置从数据库读取,可单机模式启动也可以集群模式启动,启动时 ./start.sh -m standaloneapplication.properties 主要是db部分配置## Copyright 1999-2018 Alibaba Group Holding Ltd.## Licensed under the Apache License,_seata1.4.0 +nacos 集成

iperf3常用_iperf客户端指定ip地址-程序员宅基地

文章浏览阅读833次。iperf使用方法详解 iperf3是一款带宽测试工具,它支持调节各种参数,比如通信协议,数据包个数,发送持续时间,测试完会报告网络带宽,丢包率和其他参数。 安装 sudo apt-get install iperf3 iPerf3常用的参数: -c :指定客户端模式。例如:iperf3 -c 192.168.1.100。这将使用客户端模式连接到IP地址为192.16..._iperf客户端指定ip地址

浮点性(float)转化为字符串类型 自定义实现和深入探讨C++内部实现方法_c++浮点数 转 字符串 精度损失最小-程序员宅基地

文章浏览阅读7.4k次。 写这个函数目的不是为了和C/C++库中的函数在性能和安全性上一比高低,只是为了给那些喜欢探讨函数内部实现的网友,提供一种从浮点性到字符串转换的一种途径。 浮点数是有精度限制的,所以即使我们在使用C/C++中的sprintf或者cout 限制,当然这个精度限制是可以修改的。比方在C++中,我们可以cout.precision(10),不过这样设置的整个输出字符长度为10,而不是特定的小数点后1_c++浮点数 转 字符串 精度损失最小

推荐文章

热门文章

相关标签