我有几个使用MINA的Java应用程序,它们都使用20个MINA线程.一个应用程序提供大约10,000个并发连接,这些连接通常是空闲的但有时会接收输 对于该应用程序来说,20可能是一个合理的线程数,虽然我没有完全描述它(这个问题正在进行中).另一个应用程序一次只能提供大约15个连接但启动IO工作,因此它们非常繁忙,无论如何都有20个MINA线程,这显然太多了.
对我来说很奇怪的是,两个应用程序总是把他们的CPU时间的30%,有时高达60%用于MINA的select()方法,在VisualVM中进行了分析.调用堆栈如下所示:
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:228)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:81)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87)
- locked <40ca5d54> (a sun.nio.ch.Util$2)
- locked <24649fe8> (a java.util.Collections$UnmodifiableSet)
- locked <3fae9662> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:98)
at org.apache.mina.transport.socket.nio.NioProcessor.select(NioProcessor.java:72)
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1093)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Run Code Online (Sandbox Code Playgroud)
它似乎是基于一个繁忙的民意调查,这对我来说听起来真的不对.
当我看到数字那么高时,我应该担心吗?是什么导致这个?这是我需要优化的东西还是更类似于睡眠或闲置程序?如果它更像是一个睡眠例程,它会以某种方式被安排为比其他CPU工作更低的优先级?
更新: 这个线程似乎是同一个问题.我遵循了它的建议,现在正在运行Java 1.7.0_45,但我仍然看到select在具有10k连接的应用程序中占用高达90%的CPU时间.
我们正在使用MINA 2.0.4,这意味着修复了相关的错误.
我们已经编写了一个控制台应用程序(将用作服务),它启动了几个工作线程来处理通过mina传入的请求.当在特定网络端口上接收到停止信号时,应用程序离开主循环.这是停止服务的预期方式.这非常正常,但是当收到停止信号时,应用程序的过程不会立即终止(最多需要5分钟).我们通过日志消息验证主要功能是否按预期快速离开,并且应用程序创建的所有线程也被终止.但应用程序继续运行.
在离开main函数之前仍然运行的线程是:
Signal Dispatcher (java.lang.Thread)
Finalizer (java.lang.ref.Finalizer$FinalizerThread)
Abandoned connection cleanup thread (com.mysql.jdbc.AbandonedConnectionCleanupThread)
main (java.lang.Thread)
pool-2-thread-1 (java.lang.Thread)
Reference Handler (java.lang.ref.Reference$ReferenceHandler)
Run Code Online (Sandbox Code Playgroud)
我们目前使用以下java版本:
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
Run Code Online (Sandbox Code Playgroud)
操作系统是ubuntu 14.04 LTS.
我对此行为一无所知,我希望能提供一些有关如何进一步调查此问题的提示.
附加信息
我按照建议生成了一个Full thread dump.四个线程在等待:
"pool-2-thread-1" prio=10 tid=0x00007fd7fc51f000 nid=0x16200 waiting on condition [0x00007fd800318000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000cceaf660> (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:359)
at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:942)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) …Run Code Online (Sandbox Code Playgroud) 大约四天前,我开始研究Apache MINA框架.我特别觉得它非常有趣,但很快我注意到研究材料不完整.我在"用户指南"网站上看到的,我看到它似乎已经过时,将两个库MINA 1.x混合到2.x. 我已经有一段时间了,因为我在互联网上看到了一个更新的日期.我一直在研究,我认为自MINA更新以来大约需要1年.
我的问题是:
该项目被废弃了吗?
如果是这样,您的读者和其他程序员推荐的其他项目,哪些具有MINA等功能?
如果没有,我怎么能和设计师交谈?当他们谈到"订阅"时,我试图通过电子邮件注册,但我不能.实际上,我收到一条错误消息,说我的电子邮件无法发送,即使我检查并更正了送货地址.
我正在使用Apache Mina SSHD来实现测试SFTPServer.我已经能够为简单的密码验证工作,但是我无法为PublicKey身份验证配置东西.我有一个实现了PublickeyAuthenticator接口,如下所示,
public class SimpleKeyAuthenticator implements PublickeyAuthenticator {
@Override
public boolean authenticate(String username, PublicKey key, ServerSession session) {
System.out.println("In authenticate");
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我的服务器实现如下,
...
sshd = SshServer.setUpDefaultServer();
sshd.setPort(2222);
//sshd.setPort(config.getSFTPPort());
//sshd.setKeyPairProvider(new
sshd.setKeyPairProvider(new PEMGeneratorHostKeyProvider("hostkey.pem"));
//sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider());
sshd.setPublickeyAuthenticator(new SimpleKeyAuthenticator());
sshd.setFileSystemFactory(new SimpleFileSystemFactory());
List<NamedFactory<UserAuth>> userAuthFactories = new ArrayList<NamedFactory<UserAuth>>();
userAuthFactories.add(new UserAuthNone.Factory());
sshd.setUserAuthFactories(userAuthFactories);
sshd.setCommandFactory(new ScpCommandFactory());
List<NamedFactory<Command>> namedFactoryList = new ArrayList<NamedFactory<Command>>();
namedFactoryList.add(new SftpSubsystem.Factory());
sshd.setSubsystemFactories(namedFactoryList);
sshd.setSessionFactory(new SimpleSessionFactory(handler));
try {
sshd.start();
} catch (Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用我的SFTP客户端获取文件时,一切正常.我希望authenticate方法失败,因为它总是返回false.我已经尝试将KeyPairProvider设置为使用PEMGeneratorHostKeyProvider和SimpleGeneratorHostKeyProvider.我还设置了PublicKeyAuthenticator来使用我的SimpleKeyAuthenticator类.注意,当我查看控制台输出时,我从未看到"In authenticate",因此我知道Authenticate永远不会被调用.有人可以指点我错过的东西吗?任何帮助表示赞赏.
问候,马克
出于生产目的,我需要运行三个进程.这是我的procfile,我使用Foreman启动它们:
web: bundle exec rails s Puma -p $PORT
queuing: bundle exec clockwork clock.rb
workers: bundle exec rake resque:workers
Run Code Online (Sandbox Code Playgroud)
部署我正在使用Mina.在部署任务结束时启动Foreman的适当方法是什么?目前我开始是这样的:
desc "Deploys the current version to the server."
task :deploy => :environment do
deploy do
invoke :'git:clone'
invoke :'deploy:link_shared_paths'
invoke :'bundle:install'
invoke :'rails:db_migrate'
invoke :'rails:assets_precompile'
to :launch do
queue "touch #{deploy_to}/tmp/restart.txt"
queue "bundle exec foreman start"
end
end
end
Run Code Online (Sandbox Code Playgroud)
...但我不认为这是正确的方式,因为"mina deploy"命令永远不会成功退出,本地控制台只是开始输出这些进程正在做的任何事情.
问题二:如何在单独的文件中分别初始化这三个进程中的每个进程的日志记录?
当其中一个进程崩溃时,如何防止杀死所有这三个进程?如何在崩溃时重新启动进程?
谢谢!
我正在尝试使用mina将我的应用程序部署到数字海洋服务器并在bitbucket上有一个git repo.我能够运行mina setup' just fine, but when I runmina deploy`我收到了一个错误.
我的deploy.rb
require 'mina/bundler'
require 'mina/rails'
require 'mina/git'
require 'mina/rbenv' # for rbenv support. (http://rbenv.org)
# require 'mina/rvm' # for rvm support. (http://rvm.io)
# Basic settings:
# domain - The hostname to SSH to.
# deploy_to - Path to deploy into.
# repository - Git repo to clone from. (needed by mina/git)
# branch - Branch name to deploy. (needed by mina/git)
set :rails_env, 'production'
set :domain, 'my.server'
set …Run Code Online (Sandbox Code Playgroud) 我使用Apache MINA SSHD来构建我自己的自定义SFTP服务器.
我想限制用户看到的文件系统.我只是希望他们在/ aa/bb/cc下看到目录结构
我不希望他们能够看到或导航任何其他文件夹.
从/ aa/bb/cc下的目录中,用户将具有对某些目录的读访问权限,并且只能对所选择的几个目录进行写访问.我怎么做到这一点?
Mina无法加载database.yml文件中的环境变量,如下所述:
deploy.rb:
task :deploy => :environment do
deploy do
# Put things that will set up an empty directory into a fully set-up
# instance of your project.
invoke :'git:clone'
invoke :'deploy:link_shared_paths'
invoke :'bundle:install'
invoke :'rails:db_migrate'
queue! "#{rake} db:seed"
invoke :'rails:assets_precompile'
invoke :'deploy:cleanup'
end
end
Run Code Online (Sandbox Code Playgroud)
vim~/.bash_profile:
export MYSQLUSERNAME=mysql_user_name
export MYSQLPASSWORD=mysql_password
Run Code Online (Sandbox Code Playgroud)
database.yml的:
production:
adapter: mysql2
encoding: utf8
reconnect: false
database: my_db_name
pool: 5
username: <%= ENV['MYSQLUSERNAME'] %>
password: <%= ENV['MYSQLPASSWORD'] %>
Run Code Online (Sandbox Code Playgroud)
错误:
$ mina deploy
.....
.......
-----> DB migrations unchanged; …Run Code Online (Sandbox Code Playgroud) 目前我正在研究SFTP协议.我使用Apache Mina Sshd库创建了SFTP客户端使用Jsch库和SFTP服务器.我已经建立了它们之间的连接,并且可以成功地将文件发送到SFTP服务器.现在我正在创建一个SFTP服务器处理传入文件的辅助文件处理程序.举个例子,假设SFTP服务器可以从SFTP客户端接收文件,但是当前在我的实现中,当文件到达服务器时没有办法通知.我只是去服务器根文件夹,看看是否有是一个可用的文件.这就是我知道文件是否到达的方式.
我想实现当文件到达服务器时它将通知用户文件到达和文件内容.(文件名和其他详细信息).但问题是我是Apache Mina的新手sshd API.i已经通过文档但我无法弄明白.
请问我是否知道如果在Apache Mina Sshd服务器中有任何已经实现的侦听器来处理传入文件,或者如果没有,我如何为传入文件实现我自己的侦听器.
SFTP服务器代码
public class SftpServerStarter {
private SshServer sshd;
private final static Logger logger = LoggerFactory.getLogger(SftpServerStarter.class);
public void start(){
sshd = SshServer.setUpDefaultServer();
sshd.setPort(22);
sshd.setHost("localhost");
sshd.setPasswordAuthenticator(new MyPasswordAuthenticator());
sshd.setPublickeyAuthenticator(new MyPublickeyAuthenticator());
sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider());
sshd.setSubsystemFactories(Arrays.<NamedFactory<Command>>asList(new SftpSubsystem.Factory()));
sshd.setCommandFactory(new ScpCommandFactory());
sshd.setFileSystemFactory(new VirtualFileSystemFactory("C:/root"));
try {
logger.info("Starting ...");
sshd.start();
logger.info("Started");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.info("Can not Start Server");
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用 Mina SSHD 客户端在 OpenSSH 服务器上运行远程命令。我正在远程服务器上执行一个长时间运行的命令,并希望它在客户端会话关闭时终止。
当我从 PC 终端运行此命令时:
\#ssh -t user@server sleep 12345
Run Code Online (Sandbox Code Playgroud)
这是我在远程机器上找到的:
\# ps -axf
---- Omitted for clarity
12158 ? Ss 0:29 /usr/sbin/sshd -4
22708 ? Ss 0:11 \\_ sshd: user@pts/3,pts/4
16894 pts/3 Ss 0:00 | \\_ -bash
17750 pts/3 R+ 0:00 | | \\_ ps -axf
17606 pts/4 Ss+ 0:00 | \\_ sleep 12345
---- Omitted for clarity
Run Code Online (Sandbox Code Playgroud)
当我终止计算机上的 ssh 客户端时,“睡眠 12345”将在远程计算机上终止。
然而,当我使用 Mina Java SSH 客户端运行完全相同的内容时,我看到了这样的结果。
SshClient client = SshClient.setUpDefaultClient();
client.start();
ConnectFuture connect = …Run Code Online (Sandbox Code Playgroud)