我几天来一直在寻找答案,以找出为什么我的 C# MassTransit 配置在空闲时使用如此多的 CPU。
我发现其他用户提出同样问题的回复很少,大多数人都说“你一定做错了什么”。 问题是,我已经按照 MassTransit 网站上的示例进行操作,甚至完成了一个简单的项目,但仍然看到它在空闲时使用 30+% 的 cpu。
有什么办法可以让它在闲置时使用0-10%吗? 在我们的环境中,运行一个空闲时消耗 30% 以上 cpu 的进程是很重要的。
这是我如何在 dotnet 7 应用程序中配置 MT 的示例:
.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>();
});
});
食用时:
public class AgentConsumer : IConsumer<ServerMessageContract>
{
readonly ILogger<AgentConsumer> _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;
}
}
发布时:
var endpoint = await _bus.GetSendEndpoint(new Uri($"rabbitmq://{ServerAddress}/{SendQueue}"));
await endpoint.Send(agentMessage, stoppingToken);
非常简单......
编辑: 问题出在我们内部创建的另一个库,它导致了 CPU 的峰值。 通过排除法我们发现了问题。
好吧,我不想重复你在其他地方听到的内容,但这是你的事情。
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
outbox-api
和 outbox-service
都在使用大量端点针对 RabbitMQ 运行 MassTransit。正如你所看到的,几乎闲置。
这是来自 Sample-Outbox 项目。