[ 
https://issues.apache.org/jira/browse/AMQ-5527?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14288083#comment-14288083
 ] 

Michael Rimov commented on AMQ-5527:
------------------------------------

I think my initial report was inaccurate and it didn't have to do with size.  
Relevant setup:
{code}

  <broker brokerName="testBroker" 
xmlns="http://activemq.apache.org/schema/core"; advisorySupport="true" 
useJmx="true" offlineDurableSubscriberTimeout="10000" >
      <destinationPolicy>
        <policyMap>
          <policyEntries>
            <policyEntry queue=">" optimizedDispatch="true" 
producerFlowControl="false" memoryLimit="128mb" expireMessagesPeriod="300">
              <deadLetterStrategy>
                <individualDeadLetterStrategy queuePrefix="DLQ." 
useQueueForQueueMessages="true"/>
              </deadLetterStrategy>
            </policyEntry>
          </policyEntries>
        </policyMap>
      </destinationPolicy>

      <persistenceAdapter>
        <jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" 
dataSource="#mysql-ds" lockKeepAlivePeriod="5000">
                <locker>
                    <lease-database-locker lockAcquireSleepInterval="10000" 
leaseHolderId="testBroker"/>
          </locker>
        </jdbcPersistenceAdapter>
      </persistenceAdapter>

      <transportConnectors>
        <transportConnector name="nio" uri="nio://0.0.0.0:55540"/>
        <transportConnector name="stomp+nio" uri="stomp+nio://0.0.0.0:61613"/>
      </transportConnectors>
    </broker>
    <!-- MySql DataSource Setup -->
    <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource">
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="${jms.jdbc.url}"/>
      <property name="username" value="${jms.jdbc.username}"/>
      <property name="password" value="${jms.jdbc.password}"/>
      <property name="maxActive" value="50"/>
      <property name="poolPreparedStatements" value="false"/>
    </bean>
{code}

If I was running the following test: (Disclaimer:Code was admittedly snagged 
from AMQ5212, it may not always make sense :) )

{code}
import javax.jms.JMSException;
import javax.jms.Session;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQMessageProducer;
import org.apache.activemq.ActiveMQSession;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTextMessage;
import org.junit.Test;

public class AMQ5527Test {
            
            @Test
            public void testSendMultipleMessagesToDLQ() throws JMSException {
                //Whatever your local server is.
                final ActiveMQConnectionFactory connectionFactory = new 
ActiveMQConnectionFactory("nio://localhost:55540");
                connectionFactory.setCopyMessageOnSend(false);
                connectionFactory.setWatchTopicAdvisories(false);
                ActiveMQConnection activeMQConnection = (ActiveMQConnection) 
connectionFactory.createConnection();
                activeMQConnection.start();
                
                //Create it as transacted so I can browse it afterwards in 
JConsole
                ActiveMQSession activeMQSession = (ActiveMQSession) 
activeMQConnection.createSession(true, Session.CLIENT_ACKNOWLEDGE);

                try {
                        ActiveMQQueue dest = new ActiveMQQueue("test-queue-" 
                                + getClass().getSimpleName());
                        ActiveMQMessageProducer activeMQMessageProducer = 
(ActiveMQMessageProducer) activeMQSession.createProducer(dest);
                        // create demand so page in will happen
                        activeMQSession.createConsumer(dest);
                        ActiveMQTextMessage message = new ActiveMQTextMessage();
                        message.setDestination(dest);
                        activeMQMessageProducer.send(message, null);
                
                        // send a duplicate
                        activeMQConnection.syncSendPacket(message);
                  
                        //Do it again.
                        activeMQConnection.syncSendPacket(message);
                } finally {
                        activeMQSession.commit();
                }
                activeMQConnection.close();
                
            }

}
{code}

and then go to the console.  Select the main test queue.   Go to OperationsPage 
and click "browseAsTable"

CPU core usage immediately shot up to 170% usage (as reported by Mac Activity 
Monitor)  and it hasn't come out of it yet as I'm writing this report. 

I hope this is more helpful.

> Performance issues for org.apache.activemq.broker.jmx.QueueView.removeMessage
> -----------------------------------------------------------------------------
>
>                 Key: AMQ-5527
>                 URL: https://issues.apache.org/jira/browse/AMQ-5527
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker, JMX
>    Affects Versions: 5.10.0
>         Environment: Mac/Linux
>            Reporter: Michael Rimov
>            Priority: Minor
>              Labels: performance
>
> On large, persistent queues, (100,000+ messages), we're noticing huge 
> performance issues with Queue.removeMessage().  (It takes 8-20 minutes to 
> remove a single message).  
> Thread dump while running showed this:
> "RMI TCP Connection(5)-192.168.1.10" daemon prio=5 tid=0x00007f8491954800 
> nid=0x9807 runnable [0x000000011bfd7000]
>    java.lang.Thread.State: RUNNABLE
>       at 
> org.apache.activemq.broker.region.cursors.OrderedPendingList.contains(OrderedPendingList.java:144)
>       at org.apache.activemq.broker.region.Queue.doPageIn(Queue.java:1913)
>       at org.apache.activemq.broker.region.Queue.doPageIn(Queue.java:1901)
>       at 
> org.apache.activemq.broker.region.Queue.removeMatchingMessages(Queue.java:1374)
>       at 
> org.apache.activemq.broker.region.Queue.removeMessage(Queue.java:1341)
>       at 
> org.apache.activemq.broker.jmx.QueueView.removeMessage(QueueView.java:60)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at java.lang.reflect.Method.invoke(Method.java:606)
>       at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:75)
>       at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at java.lang.reflect.Method.invoke(Method.java:606)
>       at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:279)
>       at 
> com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:112)
>       at 
> com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:46)
>       at 
> com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:237)
>       at com.sun.jmx.mbeanserver.PerInterface.invoke(PerInterface.java:138)
>       at com.sun.jmx.mbeanserver.MBeanSupport.invoke(MBeanSupport.java:252)
>       at javax.management.StandardMBean.invoke(StandardMBean.java:405)
>       at 
> org.apache.activemq.broker.jmx.AnnotatedMBean.invoke(AnnotatedMBean.java:198)
> Strangely, the web admin console is completely responsive and attempting a 
> delete through the web console is highly performant even on large queues.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to