C# Masstransit using 30% CPU when idle

110 views Asked by At

I've been searching for an answer for several days now to find out why my C# MassTransit configuration is using so much CPU when it is idle.

I found very few responses to other users asking this same question, and mostly they state "you must be doing something wrong". Problem is, I've followed the examples on the MassTransit website and even done a bare bones project and still see it using 30+% cpu when it is just idle.

Is there something that can be done to make it use 0-10% when idle? In our environment running a process that will consume 30+% cpu at idle is significant.

Here is an example of how I have MT configured in my dotnet 7 app:

.ConfigureServices((host, services) =>
{

IAgentInformation agentInformation = new AgentInformation(host.Configuration);

services.AddMassTransit(x =>
{
    x.SetKebabCaseEndpointNameFormatter();

    var entryAssembly = Assembly.GetEntryAssembly();

    x.AddConsumer<AgentConsumer>();
    x.AddSagaStateMachines(entryAssembly);
    x.AddSagas(entryAssembly);
    x.AddActivities(entryAssembly);

    x.UsingRabbitMq((context, cfg) =>
    {
        cfg.Host(agentInformation.ATLASServer, "/", h =>
        {
            h.Username(agentInformation.RabbitId);
            h.Password(agentInformation.Rabbit);
        });

        cfg.ConfigureEndpoints(context);
    });
    services.AddHostedService<Worker>();
});
});

And when consuming:

public class AgentConsumer : IConsumer<ServerMessageContract>

{ readonly ILogger _logger;

public AgentConsumer(ILogger<AgentConsumer> logger)
{
    _logger = logger;
}

public Task Consume(ConsumeContext<ServerMessageContract> context)
{
    _logger.LogInformation("Received Message: {Text}", context.Message.Payload == null ? "" : context.Message.Payload.ToString());
    TaskRunner.CommandsFromServer(context.Message);

    return Task.CompletedTask;
}

}

And when publishing:

            var endpoint = await _bus.GetSendEndpoint(new Uri($"rabbitmq://{ServerAddress}/{SendQueue}"));
            await endpoint.Send(agentMessage, stoppingToken);

Pretty straight forward....

1

There are 1 answers

4
Chris Patterson On

Well, I don't want to echo what you've heard elsewhere, but it's something on your end.

CONTAINER ID   NAME                CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDS
09155c5ce2d1   outbox-postgres-1   0.12%     75.51MiB / 47.06GiB   0.16%     95.8kB / 107kB    47.3MB / 47.5MB   8
6ad4b6151e35   outbox-rabbitmq-1   0.51%     149.1MiB / 47.06GiB   0.31%     10.9kB / 8.23kB   57.3MB / 778kB    46
317dc978e517   outbox-api-1        0.55%     89.48MiB / 47.06GiB   0.19%     96.3kB / 89.8kB   34.9MB / 0B       29
8dda648a87ad   outbox-jaeger-1     0.05%     10.66MiB / 47.06GiB   0.02%     1.47kB / 0B       29.7MB / 0B       16
f01392265691   outbox-service-1    0.00%     67.85MiB / 47.06GiB   0.14%     21.8kB / 14.1kB   62.1MB / 0B       16

Both outbox-api and outbox-service are running MassTransit against RabbitMQ with a whole bunch of endpoints. As you can see, nearly idle.

This is from the Sample-Outbox project.