vsftpd并发参数调优
一、前言
vsftpd官方文档写到standalone(常用)模式下, 单机性能可达4000以上,左右性能好的话,甚至可达到20000。
max_clients=0 (默认无限制)
解释:如果 vsftpd 是以 stand alone 方式启动的,那么这个设定项目可以设定同一时间,最多有多少 client 可以同时连上 vsftpd !限制使用 FTP 的用量!
max_per_ip=0 (默认无限制)???
解释:与上面 max_clients 类似,这里是同一个 IP 同一时间可允许多少连接。
二、压力测试
测试机器:centos7 2G 1核CPU2线程
软件版本:vsftpd 3.0.2
说明:vsftpd采用单进程多线程的方式接收客户端请求,并发连接数可以通过linux命令查看。
pstree -p pid |wc -l (其中pid未vsftpd进程号)。
1.压力测试工具
LoadRunner 2021压测ftp
jmeter压测ftp
2.java代码压测
- pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ustc</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/commons-net/commons-net -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
</dependencies>
</project>
- FtpTest.java
package test;
import java.io.IOException;
import java.net.SocketException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
public class FtpTest {
private static final String FTP_IP = "192.168.198.130";
private static final Integer FTP_PORT = 21;
private static final String FTP_USERNAME = "ftpserver";
private static final String FTP_PASSWORD = "111111";
private static final String FTP_ENCODE = "UTF-8";
public static FTPClient getConnection() {
FTPClient ftpClient = new FTPClient();
ftpClient.setConnectTimeout(60000);
ftpClient.setDataTimeout(30000);
ftpClient.setControlEncoding(FTP_ENCODE);// 解决上传文件时文件名乱码
int reply = 0;
try {
ftpClient.connect(FTP_IP, FTP_PORT);
ftpClient.login(FTP_USERNAME, FTP_PASSWORD);
/**
* 不经中转服务器(相对于remote而言),本地被动模式
*/
ftpClient.enterLocalActiveMode();
/**
* 登陆成功,返回码是230
*/
reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return ftpClient;
}
public static void main(String[] args) {
/**
* 并发量
*/
int size = 210;
ExecutorService service = Executors.newFixedThreadPool(size);
for(int i=0;i<size;i++) {
service.execute(new Runnable() {
public void run() {
FTPClient client = getConnection();
try {
FTPFile[] files = client.listFiles();
System.out.println(files[0].getName());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
Thread.sleep(1000*600);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(client.isConnected()) {
client.disconnect();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
}
service.shutdown();
}
}
三、结论
1.max_per_ip默认值是50
测试结果:max_per_ip默认值并不是0(无限制),而是50
注意:ftpClient.setConnectTimeout(30000); //连接等待时间不宜设置过短,一开始设置3秒时,偶尔连接报错,但不是421 连接过多错误,而是服务端主动关闭连接;30秒连接稳定,无问题。
压测结果:连接超时时间设置为30秒,并发支持可稳定在500左右。等待数分钟后,继续请求,总并发支持可达1200,机器性能好的话,可达官方所说的理论值.
vim vsftpd.conf
max_clients=20000
max_per_ip=1000
说明: 增加以上配置是有效的。
鉴于测试中极短时间内高并发,服务器无法支持,可搭配超时设置保证连接的稳定:
#设置建立FTP连接的超时时间,单位为秒。默认值为60。
accept_timeout=60
#PORT 方式下建立数据连接的超时时间,单位为秒。默认值为60。
connect_timeout=60
#设置建立FTP数据连接的超时时间,单位为秒。默认值为120。
data_connection_timeout=120
#可适当放短,在客户端未及时关闭连接时,以到达快速回收的目的。
#设置多长时间不对FTP服务器进行任何操作,则断开该FTP连接,单位为秒。默认值为300 。
idle_session_timeout=60
#禁用域名反解析
reverse_lookup_enable=NO
客户端超时时间设置:
适度调整,防止网络异常断开后,客户端持续等待,tomcat线程阻塞。
ftpClient.setConnectTimeout(120000);
超过限制:
421 Too many connections from this IP
2.vsftpd并发数可达理论值(TPS低)
机器性能好的话,vsftpd并发数可达官方所说的理论值;但TPS较低仅仅
20t/s
,同样硬件配置下,windows IIS ftp
TPS可达1500t/s
。
为什么?❓ ❓ ❓
参考文档:
Vsftpd中文文档
vsftpd配置文件详解
vsftp的详细配置