IBM MQ调优传输大量文件

问题描述 投票:0回答:1

我有一个使用IBM MQ传输文件的项目。有10000个客户端和一个数据中心。最大文件大小将近8MB。 MQ集群包含位于不同Windows服务器上的三个MQ管理器。每个MQ管理器都有5个用于客户端的通道和5个用于数据中心的通道。有两种情况需要测试。在每种情况下,客户端平均分配给MQ管理器。在这些情况下,最重要的是不要丢失任何文件。

Case 1:
Every client send 50 files to data center at the same time. The files size are between 150KB to 5MB. 
In this case, the sum of file size one client send is almost 80MB.

Case 2 :
Data center send the 10 identical files to every client at the same time. In this case, I create a topic named `myTopic` and 10000 clients subscribe this topic. Data center send 10 identical files to the topic.

MQ经理人负担沉重。我已经在IBM MQ中设置了一些属性:

Queue Manager:
    Max handles: 100000
    Maximum message length: 100MB
    Max channels: 10000
    Max channels: 10000

是否有任何可以提高性能的属性?

5/11更新:

首先,我已经修改了上述情况2的情况。我有一个具有4核心CPU和32G RAM的数据中心服务器。我使用4个客户端服务器来模拟10000个客户端,每个客户端服务器都有4个核心CPU和16G RAM。

在第一种情况下,当1000个客户端将文件发送到数据中心时,大约需要37分钟。当数据中心从2000个客户端接收文件时,数据中心服务器上的内存不足。我发现有20G内存用于缓冲区/缓存。这是我用来接收文件的Java代码:

try {
    String filePath = ConfigReader.getInstance().getConfig("filePath");

    MQMessage mqMsg = new MQMessage();
    mqMsg.messageId = CMQC.MQMI_NONE;
    mqMsg.correlationId = CMQC.MQCI_NONE;
    mqMsg.groupId = CMQC.MQGI_NONE;

    int flag = 1;

    while (true) {
        try {
            MQQueueManager queueManager = new MQQueueManager("QMGR1");
            int option = CMQC.MQTOPIC_OPEN_AS_SUBSCRIPTION | CMQC.MQSO_DURABLE;
            MQTopic subscriber = queueManager.accessTopic("", "myTopic", option, null, "datacenter");
            subscriber.get(mqMsg);

            if (mqMsg.getDataLength() != 0) {
                String fileName = filePath + "_file" + flag + ".txt";

                byte[] b = new byte[mqMsg.getDataLength()];
                mqMsg.readFully(b);

                System.out.println("Receive " + fileName + ", complete time: " + System.currentTimeMillis());
                Path path = Paths.get(fileName);
                System.out.println("Write " + fileName + ", start time: " + System.currentTimeMillis());
                Files.write(path, b);
                System.out.println("Write " + fileName + ", complete time: " + System.currentTimeMillis());
                flag++;
            }
        } catch (MQException e) {
            // e.printStackTrace();
            if (e.reasonCode != 2033) {
                e.printStackTrace();
            }
        } finally {
            mqMsg.clearMessage();
            mqMsg.messageId = CMQC.MQMI_NONE;
            mqMsg.correlationId = CMQC.MQCI_NONE;
            mqMsg.groupId = CMQC.MQGI_NONE;
        }
    }
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

我使用字节数组读取消息并将其写入磁盘。字节数组是否可能不释放内存并占用20G内存?

在情况2中,我发现是否向myTopic发送了5MB的文件,该文件在MQ manager01上有1000个订阅者,所以MQ manager01需要花费大量时间与集群成员进行同步。 MQ服务器上的磁盘非常繁忙。还有另一个问题:有时我只需要7秒钟即可发送5MB的文件,有时需要90秒钟。这是我发送文件的Java代码:

try {
    MQQueueManager queueManager = new MQQueueManager("QMGR1");
    MQTopic publisher = queueManager.accessTopic("myTopic", "", CMQC.MQTOPIC_OPEN_AS_PUBLICATION,
            CMQC.MQOO_OUTPUT);
    System.out.println("---- start publish , time: " + System.currentTimeMillis() + " ----");
    publisher.put(InMemoryDataProvider.getInstance().getMessage("my5MBFile"));
    System.out.println("---- end publish , time: " + System.currentTimeMillis() + " ----");
    publish.getPublisher().close();
} catch (MQException e) {
    System.out.println("threadNum: " + publish.getThreadNo() + " publish error");
    if (e.reasonCode != 2033) {
        e.printStackTrace();
    }
}
websphere ibm-mq file-transfer large-files large-data-volumes
1个回答
0
投票

几件事。

MQ具有FTE,可以为您传输文件。我认为它是使用非持久性消息来完成的,因此可以避免磁盘开销。

[您可以尝试在.ini文件中检查诸如ClntRcvBuffSize = 0之类的参数参见here。0表示使用操作系统值。

TCP过去曾以短数据包(64KB块)发送一些数据,然后等到数据包被确认后再发送。如果连接可靠,则可以通过发送更大的逻辑数据包来获得更高的吞吐量,这种技术称为动态权限大小调整。参见here

当连接寿命长并且发送大量数据时,它的工作效果最佳。例如,前几个块可能是64KB,然后将其稍微增加到128KB块,如果需要的话最终增加到100MB(或更多)。

您需要设置两端。

取决于平台,可以使用Netstat替换ss命令显示各种窗口大小。

对于您的QM到QM通道,请指定大的batchsz和batchlim-尽管这可能会使磁盘IO变得更糟,因为数据更快地到达远程端。

© www.soinside.com 2019 - 2024. All rights reserved.