ibm mq 用java在aix平台上put消息慢的问题
这个问题很细,可能未必有人碰到过,到这里问下碰碰运气。我用com.ibm.mq.jar包里的方法向mq的一个远程队列放消息,示意代码如下MQEnvironment.hos...
这个问题很细,可能未必有人碰到过,到这里问下碰碰运气。
我用com.ibm.mq.jar包里的方法向mq的一个远程队列放消息,示意代码如下
MQEnvironment.hostname = props.getProperty("mqHostName");
MQEnvironment.port = Integer.parseInt(props.getProperty("mqPort"));
MQEnvironment.CCSID = Integer.parseInt(props.getProperty("mqCCSID"));
MQEnvironment.channel = props.getProperty("mqChannel");
MQQueueManager qMgr = new MQQueueManager(props.getProperty("mqQManager"));
int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING|MQC.MQOO_SET_IDENTITY_CONTEXT;
MQQueue q = qMgr.accessQueue(props.getProperty("mqRemoteQueue"), openOptions);
MQMessage msg = new MQMessage();
MQPutMessageOptions pmo=new MQPutMessageOptions();
pmo.options=MQC.MQPMO_LOGICAL_ORDER|MQC.MQPMO_FAIL_IF_QUIESCING|MQC.MQPMO_NO_SYNCPOINT|MQC.MQPMO_NEW_MSG_ID|MQC.MQPMO_NEW_CORREL_ID;
msg.format=MQC.MQFMT_STRING;
msg.write(content);
q.put(msg);
q.close();
qMgr.commit();
qMgr.disconnect();
其中content是一个byte[]。
然后就是问题了,这个程序在向本地mq发消息极慢。为了分析原因,我做了一些尝试,用这个程序编译了之后放两个aix机器上运行。称为aixA,aixB。
aixA的java向aixA的mq发消息,1秒1条100K消息。
aixB的java向aixB的mq发消息,1秒1条100K消息。
aixA的java向aixB的mq发消息,1秒>50条100K消息。
aixB的java向aixA的mq发消息,1秒>50条100K消息。
故障现象是在aix上本机的java向本机的mq发消息速度极慢。
同一个java程序在windows平台没这种问题,无论是向远程mq还是本地mq发消息都很快。
日志追踪发现,aix上java调用本地mq时,几乎所有1秒的时间都用在
q.put(msg);
这一行代码上。
而调用远程mq或者是windows平台上这一行执行都非常快,都是0.01秒级的。
P.S. aixA是P740,aixB是P570,java和mq两个小小的程序完全不会造成资源紧张。aix版本6.1.0.0,mq版本6.0。com.ibm.mq.jar那一套jar包是从mq6.0安装目录里拿出来的。java编译版本是1.5。我还换过mq7.0自带的com.ibm.mq.jar一套jar包,java用过1.6、1.7编译、运行,结果都一样。现在这一套东西如果要正常用,需要占用两台aix,并且消耗额外网络资源,非常不经济,不知有人能帮忙解决我这个问题不?
端口1414、1409之类的都换过,和监听好像没什么关系。。 展开
我用com.ibm.mq.jar包里的方法向mq的一个远程队列放消息,示意代码如下
MQEnvironment.hostname = props.getProperty("mqHostName");
MQEnvironment.port = Integer.parseInt(props.getProperty("mqPort"));
MQEnvironment.CCSID = Integer.parseInt(props.getProperty("mqCCSID"));
MQEnvironment.channel = props.getProperty("mqChannel");
MQQueueManager qMgr = new MQQueueManager(props.getProperty("mqQManager"));
int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING|MQC.MQOO_SET_IDENTITY_CONTEXT;
MQQueue q = qMgr.accessQueue(props.getProperty("mqRemoteQueue"), openOptions);
MQMessage msg = new MQMessage();
MQPutMessageOptions pmo=new MQPutMessageOptions();
pmo.options=MQC.MQPMO_LOGICAL_ORDER|MQC.MQPMO_FAIL_IF_QUIESCING|MQC.MQPMO_NO_SYNCPOINT|MQC.MQPMO_NEW_MSG_ID|MQC.MQPMO_NEW_CORREL_ID;
msg.format=MQC.MQFMT_STRING;
msg.write(content);
q.put(msg);
q.close();
qMgr.commit();
qMgr.disconnect();
其中content是一个byte[]。
然后就是问题了,这个程序在向本地mq发消息极慢。为了分析原因,我做了一些尝试,用这个程序编译了之后放两个aix机器上运行。称为aixA,aixB。
aixA的java向aixA的mq发消息,1秒1条100K消息。
aixB的java向aixB的mq发消息,1秒1条100K消息。
aixA的java向aixB的mq发消息,1秒>50条100K消息。
aixB的java向aixA的mq发消息,1秒>50条100K消息。
故障现象是在aix上本机的java向本机的mq发消息速度极慢。
同一个java程序在windows平台没这种问题,无论是向远程mq还是本地mq发消息都很快。
日志追踪发现,aix上java调用本地mq时,几乎所有1秒的时间都用在
q.put(msg);
这一行代码上。
而调用远程mq或者是windows平台上这一行执行都非常快,都是0.01秒级的。
P.S. aixA是P740,aixB是P570,java和mq两个小小的程序完全不会造成资源紧张。aix版本6.1.0.0,mq版本6.0。com.ibm.mq.jar那一套jar包是从mq6.0安装目录里拿出来的。java编译版本是1.5。我还换过mq7.0自带的com.ibm.mq.jar一套jar包,java用过1.6、1.7编译、运行,结果都一样。现在这一套东西如果要正常用,需要占用两台aix,并且消耗额外网络资源,非常不经济,不知有人能帮忙解决我这个问题不?
端口1414、1409之类的都换过,和监听好像没什么关系。。 展开
5个回答
展开全部
你码了这么多字,应该有耐心看完我如下不长的一段话:
再推荐你做个测试,在linux下去执行下这个程序,看看效率是否依然很好。
我也做PCServer + 小机(IBM小机 / AIX)维护的。
据经验,部分JAVA程序在AIX提供的编译环境下执行效率非常之差,动则百万元级别的类似P570之类的AIX服务器,执行java程序的效率差不多是万把块购买的PCServer跑个Linux的1/50,这个很伤脑筋。
AIX是个好系统,个人认为目前最好用、最稳定、最有发展前景的的UNIX就是AIX,但就是跑起java来蛋疼(其实效率没有差到难以接受,但绝对不能算理想),x86平台(windows或linux)下java运行环境的效率就十分优秀,可能是优化的好。
所以我想说的是,可能这个问题比较无解,也曾请IBM专家上门诊断、抓东西回去分析,他们最终也没给个解决方案,我们的应用比较重要,重金购买的AIX服务器用来部署上线,跑出来的效率不如区区一台PCServer,而且差距还不小,我们也很尴尬(我们最后把应用剥离出来分布在多台PCServer上跑)。
再推荐你做个测试,在linux下去执行下这个程序,看看效率是否依然很好。
我也做PCServer + 小机(IBM小机 / AIX)维护的。
据经验,部分JAVA程序在AIX提供的编译环境下执行效率非常之差,动则百万元级别的类似P570之类的AIX服务器,执行java程序的效率差不多是万把块购买的PCServer跑个Linux的1/50,这个很伤脑筋。
AIX是个好系统,个人认为目前最好用、最稳定、最有发展前景的的UNIX就是AIX,但就是跑起java来蛋疼(其实效率没有差到难以接受,但绝对不能算理想),x86平台(windows或linux)下java运行环境的效率就十分优秀,可能是优化的好。
所以我想说的是,可能这个问题比较无解,也曾请IBM专家上门诊断、抓东西回去分析,他们最终也没给个解决方案,我们的应用比较重要,重金购买的AIX服务器用来部署上线,跑出来的效率不如区区一台PCServer,而且差距还不小,我们也很尴尬(我们最后把应用剥离出来分布在多台PCServer上跑)。
追问
听你这样说,感觉这个问题应该是没什么希望解决了。
把java和mq都放在windows微机服务器,执行效率非常高,每秒上百个消息,而且把磁盘和cpu资源都用掉一多半,我们这边没有linux,在一个hpunix旧机器上试过,也是比较快的。只有aix小型机不行,运行的时候占用cpu2%都不到,磁盘用的还是比较高端的存储,但是它根本不消耗,就是慢慢吞吞在跑,完全没脾气。看来这种aix小型机只能用来跑数据库,跑java应用真是白瞎了。
展开全部
如果用一台机器实例化2个mq,试试A和B用不同的端口
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
试一试用两个不同的端口吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
..
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没用用过这个,帮顶!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询