Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 频繁从sftp服务器获取连接重置错误,并行线程试图将文件放在sftp上_Java_Jsch_Sshd - Fatal编程技术网

Java 频繁从sftp服务器获取连接重置错误,并行线程试图将文件放在sftp上

Java 频繁从sftp服务器获取连接重置错误,并行线程试图将文件放在sftp上,java,jsch,sshd,Java,Jsch,Sshd,我有一段多线程代码,其中有22个线程并行运行,并试图将文件放在sftp服务器上 但我的日志中不断出现连接重置错误,几乎没有记录因此而失败 在最初的分析中,我发现sftp服务器的大小是t2.5,CPU利用率将达到92% 考虑到这一点,我将服务器更改为c5n.xlarge,现在错误出现的频率降低了,但即使在最大CPU利用率达到63%的情况下,我也会遇到错误 我在/var/log/secure的sftp服务器日志中找不到任何不同的内容 下面是一段用于放置文件的代码,每个线程创建一个新会话并关闭它 JS

我有一段多线程代码,其中有22个线程并行运行,并试图将文件放在sftp服务器上

但我的日志中不断出现连接重置错误,几乎没有记录因此而失败

在最初的分析中,我发现sftp服务器的大小是t2.5,CPU利用率将达到92%

考虑到这一点,我将服务器更改为c5n.xlarge,现在错误出现的频率降低了,但即使在最大CPU利用率达到63%的情况下,我也会遇到错误

我在/var/log/secure的sftp服务器日志中找不到任何不同的内容

下面是一段用于放置文件的代码,每个线程创建一个新会话并关闭它

JSch ssh = new JSch();
            // ssh.setKnownHosts("/path/of/known_hosts/file");
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            // Use key authentication if it is set, else use password auth
            if (mpServerDetails.get(SftpFile.SFTP_USERKEY) != null
                    && mpServerDetails.get(SftpFile.SFTP_USERKEY) != "") {
                    File userKeyFile = new File(mpServerDetails.get(SftpFile.SFTP_USERKEY).toString());
                if (userKeyFile == null || !userKeyFile.exists()) {
                    throw new NonRetriableException(
                            "Key file " + mpServerDetails.get(SftpFile.SFTP_USERKEY).toString() + "not found.");
                }
                ssh.addIdentity(userKeyFile.getAbsolutePath());
                session = ssh.getSession(mpServerDetails.get(SftpFile.SFTP_USERNAME).toString(),
                        mpServerDetails.get(SftpFile.SFTP_HOSTNAME).toString());
            } else if (mpServerDetails.get(SftpFile.SFTP_PASSWORD) != null) {
                session = ssh.getSession(mpServerDetails.get(SftpFile.SFTP_USERNAME).toString(),
                        mpServerDetails.get(SftpFile.SFTP_HOSTNAME).toString());
                session.setPassword(mpServerDetails.get(SftpFile.SFTP_PASSWORD).toString());
            }
            session.setConfig(config);
            session.connect();
            if (session != null && !session.isConnected()) {
                logger.warn("**session is not connected going to connect the sftp session ** {} ", session.getHost());
                session.connect();
            }
            channel = (ChannelSftp) session.openChannel("sftp");
            if (channel != null && !channel.isConnected()) {
                logger.warn("**channel is not connected going to connect the sftp channel ** {} ",
                        channel.getSession().isConnected());
                channel.connect();
            }
            channel.put(file.getAbsolutePath(), dest.getConfig().get(TransporterFileConstants.SFTP_DIRECTORY).toString()
                    + File.separatorChar + dest.getFileName(), new SystemOutProgressMonitor());

        }
        catch (NonRetriableException e) {
            throw new NonRetriableException(e);
        }
        catch (Exception e) {
            logger.error(
                    "Error occured while uploading file having name " + dest.getFileName() + " from remote directory:"
                            + dest.getConfig().get(TransporterFileConstants.SFTP_DIRECTORY).toString(),
                    e);
            logger.error("SFTP Exception : ", e);
            throw new RetriableException(e);
        }
        finally {
            if (null != channel && channel.isConnected()) {
                try {
                    channel.disconnect();
                }
                catch (Throwable e) {
                    logger.error("Error while disconnecting channel : ", e);
                }
            }
            if (null != session) {
                try {
                    session.disconnect();
                }
                catch (Throwable e) {
                    logger.error("Error while returning object to sftp pool : ", e);
                }
            }
        }
有人能帮我理解为什么我会遇到这个异常吗

SFTP服务器配置如下所示:

MaxSessions 50
Capacity - 25 GB
4 core server with 10 GB Ram
一段错误消息

com.jcraft.jsch.JSchException: Session.connect: java.net.SocketException: Connection reset
    at com.jcraft.jsch.Session.connect(Session.java:558) ~[honeybee-engine.jar:na]
如果这种情况继续发生,我的数据处理将不一致

MaxSessions 50
SSH server
MaxSessions
参数限制可以通过单个SSH连接运行的“会话”数量。每个连接只运行一个会话——SFTP会话,因此MaxSessions限制对您来说并不特别重要

您的问题可能在于:

MaxStartups
指定到SSH守护程序的未经身份验证的并发连接的最大数量。其他连接将被删除,直到身份验证成功或连接的LoginGraceTime过期。默认值为10:30:100

基本上,如果连接到服务器的客户机太多且尚未进行身份验证,则服务器将断开其中一些连接。如果应用程序同时打开了太多与服务器的连接,则服务器可能会删除其中一些连接。这里的解决方案是调整MaxStartups的值,或者更改应用程序以避免一次打开这么多连接


还有一个操作系统限制,称为。基本上,操作系统将只保留一定数量的挂起TCP连接。如果同时出现了足够多的连接尝试,并且ssh服务器进程接受它们的速度不够快,那么操作系统将丢弃一些连接请求。SSH服务器请求128个连接的积压,但操作系统可能会将积压设置为较低的值。如果您的SSH服务器足够繁忙,您可能会遇到这个限制。

您是否为每个文件打开了一个新的连接?是的,但也关闭了。您是否考虑重新使用每个线程中的连接?实际上,它运行有点不同,有各种执行器一直在运行和执行各种任务,我们的任务是在sftp上上传文件。它可以被任何执行器线程拾取。这个任务使用一个sftp上传服务,每当它被要求放置一些东西时,它就会创建一个新的连接。但是一次最多可以有22个执行者运行此任务。@MartinPrikryl我想了解的是,这是我的代码问题还是sftp服务器端的一些问题,因为随着我增加sftp的服务器大小,错误频率降低了,但在63%的利用率下仍然会出现错误