Skip to content

Lower throughput with a workload that heavily churns channels when upgrading from 5.1.2 to 6.1.0 #876

@aberkromb

Description

@aberkromb

We updated the version of RabbitMQ.Client library (from 5.1.2 to 6.1.0) and met a decrease in performance.
Below a minimal repro.

Framework: netcoreapp 3.1(our internal library netstandard 2.0)
RabbitMQ.Client library version: 5.1.2 and 6.1.0
RabbitMQ version: 3.8
Docker version: 19.03.8
Docker Image: rabbitmq:3.8-management-alpine
OS version: Win10 1903

attached our scripts to run a local cluster for tests
scripts.zip

For 5.1.2 i've got ~5 sec, for 6.1.0 ~58 sec

static void Main(string[] args)
        {
            var ids = Enumerable.Range(1, 512).Select(_ => Guid.NewGuid());
           
            var (factory, resolver) = ConfigureFactoryAndResolver();

            var sw = Stopwatch.StartNew();
            using (var connection = factory.CreateConnection(resolver, "example"))
            {
                Parallel.ForEach(ids,
                    new ParallelOptions {MaxDegreeOfParallelism = ids.Count()},
                    id => Publish(connection, id));
            }

            sw.Stop();
            Console.WriteLine(sw.Elapsed);
        }

        private static void Publish(IConnection connection, Guid message)
        {
            using (var channel = connection.CreateModel())
            {
                channel.ExchangeDeclare("test-exchange", "topic", true);
                channel.QueueDeclare("test-queue", true, false, false);
                channel.QueueBind("test-queue", "test-exchange", "test-rk");
                channel.BasicPublish("test-exchange", "test-rk", null, Encoding.UTF8.GetBytes(message.ToString()));
            }
        }
        
        
        /// <summary>
        ///     Create Factory for v5.1.2
        /// </summary>
        private static (ConnectionFactory factory, DefaultEndpointResolver resolver) ConfigureFactoryAndResolver()
        {
            var connectionFactory = new ConnectionFactory
            {
                HostName = "127.0.0.11",
                VirtualHost = "/",
                Port = 5672,
                UserName = "admin",
                Password = "admin",
                AutomaticRecoveryEnabled = true,
                TopologyRecoveryEnabled = false,
                RequestedHeartbeat = (ushort) TimeSpan.FromSeconds(10).TotalSeconds,
                NetworkRecoveryInterval = TimeSpan.FromSeconds(5),
                RequestedConnectionTimeout = (int) TimeSpan.FromSeconds(5).TotalMilliseconds,
                ContinuationTimeout = TimeSpan.FromSeconds(20),
                HandshakeContinuationTimeout = TimeSpan.FromSeconds(10),
                SocketReadTimeout = (int) TimeSpan.FromSeconds(30).TotalMilliseconds,
                SocketWriteTimeout = (int) TimeSpan.FromSeconds(30).TotalMilliseconds,
                UseBackgroundThreadsForIO = true
            };

            var endpoints = new[] {"127.0.0.13", "127.0.0.12", "127.0.0.11"}.Select(h =>
                new AmqpTcpEndpoint(h, connectionFactory.Port, connectionFactory.Ssl));

            return (connectionFactory, new DefaultEndpointResolver(endpoints));
        }
        
        /// <summary>
        ///     Create Factory for v6.1.0
        /// </summary>     
        // private static (ConnectionFactory factory, DefaultEndpointResolver resolver) ConfigureFactoryAndResolver()
        // {
        //     var connection_factory = new ConnectionFactory();
        //     connection_factory.HostName = "127.0.0.13";
        //     connection_factory.VirtualHost = "/";
        //     connection_factory.Port = 5672;
        //     connection_factory.UserName = "admin";
        //     connection_factory.Password = "admin";
        //     connection_factory.AutomaticRecoveryEnabled = true;
        //     connection_factory.TopologyRecoveryEnabled = false;
        //     connection_factory.RequestedHeartbeat = TimeSpan.FromSeconds(10); // пинг идёт два раза за указанное время
        //     connection_factory.NetworkRecoveryInterval = TimeSpan.FromSeconds(5);
        //     connection_factory.RequestedConnectionTimeout = TimeSpan.FromSeconds(5);
        //     connection_factory.ContinuationTimeout = TimeSpan.FromSeconds(20);
        //     connection_factory.HandshakeContinuationTimeout = TimeSpan.FromSeconds(10);
        //     connection_factory.SocketReadTimeout = TimeSpan.FromSeconds(30);
        //     connection_factory.SocketWriteTimeout = TimeSpan.FromSeconds(30);
        //     connection_factory.UseBackgroundThreadsForIO = true;
        //
        //     var endpoints = new[] {"127.0.0.13", "127.0.0.12", "127.0.0.11"}.Select(h =>
        //         new AmqpTcpEndpoint(h, connection_factory.Port, connection_factory.Ssl));
        //
        //     return (connection_factory, new DefaultEndpointResolver(endpoints));
        // }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions