Ibm mq PyMQI使用持久性的性能不佳

Ibm mq PyMQI使用持久性的性能不佳,ibm-mq,pymqi,Ibm Mq,Pymqi,我正在测试IBM MQ的性能(在本地docker容器中运行最新版本) 我使用持久队列 在生产者方面,我可以通过并行运行多个生产应用程序来获得更高的吞吐量 然而,在用户端,我不能通过并行用户进程来提高吞吐量。相反,对于多个消费者,吞吐量甚至比单个消费者更差 消费表现不佳的原因可能是什么 这不应该是由于硬件的限制,因为我将消耗量与生产量进行比较,并且我只进行了消息消耗,没有进行任何其他处理 GET是否为每条消息执行提交?但是,我在PyMQI中找不到任何显式提交方法 put_demo.py #!/us

我正在测试IBM MQ的性能(在本地docker容器中运行最新版本) 我使用持久队列

在生产者方面,我可以通过并行运行多个生产应用程序来获得更高的吞吐量

然而,在用户端,我不能通过并行用户进程来提高吞吐量。相反,对于多个消费者,吞吐量甚至比单个消费者更差

消费表现不佳的原因可能是什么

这不应该是由于硬件的限制,因为我将消耗量与生产量进行比较,并且我只进行了消息消耗,没有进行任何其他处理

GET是否为每条消息执行提交?但是,我在PyMQI中找不到任何显式提交方法

put_demo.py

#!/usr/bin/env python3

import pymqi
import time

queue_manager = 'QM1'
channel = 'DEV.APP.SVRCONN'
host = '127.0.0.1'
port = '1414'
queue_name = 'DEV.QUEUE.1'
message = b'Hello from Python!'
conn_info = '%s(%s)' % (host, port)
nb_messages = 1000

t0 = time.time()
qmgr = pymqi.connect(queue_manager, channel, conn_info)
queue = pymqi.Queue(qmgr, queue_name)

for i in range(nb_messages):
    try:
        queue.put(message)
    except pymqi.MQMIError as e:
        print(f"Fatal error: {str(e)}")

queue.close()
qmgr.disconnect()
t1 = time.time()
print(f"tps: {nb_messages/(t1-t0):.0f} nb_message_produced: {nb_messages}")
#!/usr/bin/env python3

import pymqi
import time
import os

queue_manager = 'QM1'
channel = 'DEV.APP.SVRCONN'
host = '127.0.0.1'
port = '1414'
queue_name = 'DEV.QUEUE.1'
conn_info = '%s(%s)' % (host, port)
nb_messages = 1000
nb_messages_consumed = 0

t0 = time.time()
qmgr = pymqi.connect(queue_manager, channel, conn_info)
queue = pymqi.Queue(qmgr, queue_name)
gmo = pymqi.GMO(Options = pymqi.CMQC.MQGMO_WAIT | pymqi.CMQC.MQGMO_FAIL_IF_QUIESCING)
gmo.WaitInterval = 1000

while nb_messages_consumed < nb_messages:
    try:
        msg = queue.get(None, None, gmo)
        nb_messages_consumed += 1
    except pymqi.MQMIError as e:
        if e.reason == 2033:
            # No messages, that's OK, we can ignore it.
            pass

queue.close()
qmgr.disconnect()
t1 = time.time()
print(f"tps: {nb_messages_consumed/(t1-t0):.0f} nb_messages_consumed: {nb_messages_consumed}")
get_demo.py

#!/usr/bin/env python3

import pymqi
import time

queue_manager = 'QM1'
channel = 'DEV.APP.SVRCONN'
host = '127.0.0.1'
port = '1414'
queue_name = 'DEV.QUEUE.1'
message = b'Hello from Python!'
conn_info = '%s(%s)' % (host, port)
nb_messages = 1000

t0 = time.time()
qmgr = pymqi.connect(queue_manager, channel, conn_info)
queue = pymqi.Queue(qmgr, queue_name)

for i in range(nb_messages):
    try:
        queue.put(message)
    except pymqi.MQMIError as e:
        print(f"Fatal error: {str(e)}")

queue.close()
qmgr.disconnect()
t1 = time.time()
print(f"tps: {nb_messages/(t1-t0):.0f} nb_message_produced: {nb_messages}")
#!/usr/bin/env python3

import pymqi
import time
import os

queue_manager = 'QM1'
channel = 'DEV.APP.SVRCONN'
host = '127.0.0.1'
port = '1414'
queue_name = 'DEV.QUEUE.1'
conn_info = '%s(%s)' % (host, port)
nb_messages = 1000
nb_messages_consumed = 0

t0 = time.time()
qmgr = pymqi.connect(queue_manager, channel, conn_info)
queue = pymqi.Queue(qmgr, queue_name)
gmo = pymqi.GMO(Options = pymqi.CMQC.MQGMO_WAIT | pymqi.CMQC.MQGMO_FAIL_IF_QUIESCING)
gmo.WaitInterval = 1000

while nb_messages_consumed < nb_messages:
    try:
        msg = queue.get(None, None, gmo)
        nb_messages_consumed += 1
    except pymqi.MQMIError as e:
        if e.reason == 2033:
            # No messages, that's OK, we can ignore it.
            pass

queue.close()
qmgr.disconnect()
t1 = time.time()
print(f"tps: {nb_messages_consumed/(t1-t0):.0f} nb_messages_consumed: {nb_messages_consumed}")
使用同步点和批提交获取\u demo.py更新版本

#!/usr/bin/env python3

import pymqi
import time
import os

queue_manager = 'QM1'
channel = 'DEV.APP.SVRCONN'
host = '127.0.0.1'
port = '1414'
queue_name = 'DEV.QUEUE.1'
conn_info = '%s(%s)' % (host, port)
nb_messages = 1000
commit_batch = 10
nb_messages_consumed = 0

t0 = time.time()
qmgr = pymqi.connect(queue_manager, channel, conn_info)
queue = pymqi.Queue(qmgr, queue_name)
gmo = pymqi.GMO(Options = pymqi.CMQC.MQGMO_WAIT | pymqi.CMQC.MQGMO_FAIL_IF_QUIESCING | pymqi.CMQC.MQGMO_SYNCPOINT)
gmo.WaitInterval = 1000

while nb_messages_consumed < nb_messages:
    try:
        msg = queue.get(None, None, gmo)
        nb_messages_consumed += 1
        if nb_messages_consumed % commit_batch == 0:
            qmgr.commit()
    except pymqi.MQMIError as e:
        if e.reason == 2033:
            # No messages, that's OK, we can ignore it.
            pass

queue.close()
qmgr.disconnect()
t1 = time.time()
print(f"tps: {nb_messages_consumed/(t1-t0):.0f} nb_messages_consumed: {nb_messages_consumed}")
#/usr/bin/env蟒蛇3
导入pymqi
导入时间
导入操作系统
队列管理器='QM1'
频道='DEV.APP.SVRCONN'
主机='127.0.0.1'
端口='1414'
队列名称='DEV.queue.1'
连接信息=“%s(%s)”%(主机,端口)
nb_消息=1000
提交批处理=10
nb_消息_已消费=0
t0=时间。时间()
qmgr=pymqi.connect(队列管理器、通道、连接信息)
queue=pymqi.queue(qmgr,队列名称)
gmo=pymqi.gmo(Options=pymqi.CMQC.MQGMO_WAIT | pymqi.CMQC.MQGMO_FAIL_IF|u QUIESCING | pymqi.CMQC.MQGMO_SYNCPOINT)
gmo.WaitInterval=1000
当nb_消息被消费时

谢谢。

您需要提供更多详细信息来帮助回答此问题。1.您连接到的队列管理器上正在运行哪个版本的MQ。2.pymqi加载的客户端库使用的是什么版本的MQ(例如:
mqic.so
)。3.请发布你的阅读应用程序和写作应用程序。应用程序放入和从同一QLOCAL获取的队列是相同的还是存在于两个不同的队列管理器上?当您打开PUT队列时是否指定了
MQPMO_SYNCPOINT
,当您打开GET队列时是否指定了
MQGMO_SYNCPOINT
?您发布的链接显示在连接打开获取/放置关闭断开模式中只执行了一次PUT和一次GET。请告诉我们您是在循环中运行它,还是在put/get上循环。更好的办法是,在问题中张贴您的代码,以便我们清楚地看到。@MoragHughson谢谢您的回复。我刚刚在put/get中添加了一个循环,其他代码与链接中的示例完全相同。@zwush-鉴于您的代码中最重要的部分是您没有向我们展示的代码,如果您将实际代码添加到问题中,而不是添加到与您正在使用的代码有点类似的示例的链接,那会更好。此外,为了能够获取下一条消息而不是具有相同消息id的消息,您必须进行了其他更改。我们确实需要查看您的代码。请尝试在每次获取后将
MQGMO_SYNCPOINT
添加到
gmo
qmgr.commit()
添加到您的循环中。然后尝试增加每次提交前收到的消息数,例如10或50。