作者: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
文章浏览阅读1.2k次,点赞35次,收藏18次。AutowiredPostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。此方法必须在将类放入服务之前调用。支持依赖关系注入的所有类都必须支持此注释。即使类没有请求注入任何资源,用 PostConstruct 注释的方法也必须被调用。只有一个方法可以用此注释进行注释。_springboot2.7获取bean
文章浏览阅读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
文章浏览阅读981次,点赞21次,收藏18次。本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。下面我们来进行文件的恢复,执行下文中的lsof命令,在其返回结果中我们可以看到test-recovery.txt (deleted)被删除了,但是其存在一个进程tail使用它,tail进程的进程编号是1535。我们看到文件名为3的文件,就是我们刚刚“误删除”的文件,所以我们使用下面的cp命令把它恢复回去。命令进入该进程的文件目录下,1535是tail进程的进程id,这个文件目录里包含了若干该进程正在打开使用的文件。
文章浏览阅读10w+次,点赞12次,收藏72次。RTMP(Real Time Messaging Protocol)实时消息传输协议是Adobe公司提出得一种媒体流传输协议,其提供了一个双向得通道消息服务,意图在通信端之间传递带有时间信息得视频、音频和数据消息流,其通过对不同类型得消息分配不同得优先级,进而在网传能力限制下确定各种消息得传输次序。_rtmp
文章浏览阅读64次。2017年12月的计算机等级考试将要来临!出国留学网为考生们整理了2017年12月计算机一级MSOffice考试习题,希望能帮到大家,想了解更多计算机等级考试消息,请关注我们,我们会第一时间更新。2017年12月计算机一级MSOffice考试习题(二)一、单选题1). 计算机最主要的工作特点是( )。A.存储程序与自动控制B.高速度与高精度C.可靠性与可用性D.有记忆能力正确答案:A答案解析:计算...
文章浏览阅读356次。在学MYSQL的时候刚刚好看到了这个提权,很久之前用过别人现成的,但是一直时间没去细想, 这次就自己复现学习下。 0x00 UDF 什么是UDF? UDF (user defined function),即用户自定义函数。是通过添加新函数,对MySQL的功能进行扩充,就像使..._the provided input file '/usr/share/metasploit-framework/data/exploits/mysql
文章浏览阅读3.1w次,点赞71次,收藏485次。webService一 WebService概述1.1 WebService是什么WebService是一种跨编程语言和跨操作系统平台的远程调用技术。Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准...
文章浏览阅读1w次。前言照例给出官网:Retrofit官网其实大家学习的时候,完全可以按照官网Introduction,自己写一个例子来运行。但是百密一疏,官网可能忘记添加了一句非常重要的话,导致你可能出现如下错误:Could not locate ResponseBody converter错误信息:Caused by: java.lang.IllegalArgumentException: Could not l_已添加addconverterfactory 但是 could not locate responsebody converter
文章浏览阅读1k次。一套键鼠控制Windows+Linux——Synergy在Windows10和Ubuntu18.04共控的实践Synergy简介准备工作(重要)Windows服务端配置Ubuntu客户端配置配置开机启动Synergy简介Synergy能够通过IP地址实现一套键鼠对多系统、多终端进行控制,免去了对不同终端操作时频繁切换键鼠的麻烦,可跨平台使用,拥有Linux、MacOS、Windows多个版本。Synergy应用分服务端和客户端,服务端即主控端,Synergy会共享连接服务端的键鼠给客户端终端使用。本文_linux 18.04 synergy
文章浏览阅读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 集成
文章浏览阅读833次。iperf使用方法详解 iperf3是一款带宽测试工具,它支持调节各种参数,比如通信协议,数据包个数,发送持续时间,测试完会报告网络带宽,丢包率和其他参数。 安装 sudo apt-get install iperf3 iPerf3常用的参数: -c :指定客户端模式。例如:iperf3 -c 192.168.1.100。这将使用客户端模式连接到IP地址为192.16..._iperf客户端指定ip地址
文章浏览阅读7.4k次。 写这个函数目的不是为了和C/C++库中的函数在性能和安全性上一比高低,只是为了给那些喜欢探讨函数内部实现的网友,提供一种从浮点性到字符串转换的一种途径。 浮点数是有精度限制的,所以即使我们在使用C/C++中的sprintf或者cout 限制,当然这个精度限制是可以修改的。比方在C++中,我们可以cout.precision(10),不过这样设置的整个输出字符长度为10,而不是特定的小数点后1_c++浮点数 转 字符串 精度损失最小