barriers / 阅读 / 详情

RabbitMQ最佳实践

2023-08-22 17:01:59
共1条回复
贝贝
* 回复内容中包含的链接未经审核,可能存在风险,暂不予完整展示!

有些应用程序需要非常高的吞吐量,而其他一些应用程序却正在发布批处理作业,这些作业可能会延迟一段时间。在设计系统时,目标应该是最大限度地将性能和可用性结合起来,这对您的特定应用程序是有意义的。错误的体系结构设计决策或客户端错误,可能会损坏中间件或影响吞吐量。

您的发布服务器可能会停止运行,或者由于内存使用过多而导致服务器崩溃。本系列文章重点关注rabbitmq的最佳实践。应做和不应做两种不同使用类别的最佳实践相混合;高可用性和高性能(高吞吐量)。我们将讨论队列大小、常见错误、延迟队列、预取值、连接和通道、HIPE和集群中的节点数。这些通常都是最佳实践规则,基于我们在使用rabbitmq时获得的经验。

队列中的许多消息会对RAM的使用造成很大的负担。为了释放RAM,rabbitmq将(页面输出)消息刷新到磁盘。此过程会降低排队速度。当有许多消息需要分页取出时,分页过程通常会花费时间并阻止队列处理消息。许多消息可能会对中间件的性能产生负面影响。

当有许多消息重启集群时,也是费时的,因为必须重建索引。重新启动后,在群集中的节点之间同步消息也需要时间。

在rabbitmq 3.6中添加了一个名为lazy queues的功能。懒惰队列是消息自动存储到磁盘上的队列。只有在需要时才将消息加载到内存中。对于懒惰的队列,消息直接进入磁盘,因此RAM的使用被最小化,但是吞吐时间将花费更长的时间。

我们已经看到,懒惰的队列以更好的可预测性的方式,创建了一个更稳定的集群。要让您的消息不出现警告,请刷新到磁盘。你不会突然被一个性能冲击问题所困扰。如果您一次发送大量消息(例如处理批处理作业),或者如果您认为您的消费者一直无法跟上发布者的速度,我们建议您启用延迟队列。

对于经常受到消息峰值冲击的应用程序,以及要求吞吐量比其他任何东西都重要的应用程序,可以推荐的另一做法是设置队列的最大长度。这样可以通过丢弃来自队列头部的消息来保持队列的简短性,从而使队列永远不会超过max-length设置。

队列在rabbitmq中是单线程的,一个队列可以处理大约50k条消息/秒。如果您有多个队列和消费者,您可以在多核系统上获得更好的吞吐量。如果在底层节点上拥有与核心一样多的队列,那么您将获得最佳吞吐量。

rabbitmq管理接口为集群中的每个队列收集和计算度量。如果您有数千个活动队列和使用者,这可能会减慢服务器的运行速度。如果队列太多,CPU和RAM的使用也可能受到负面影响。

队列性能受限于一个CPU核心。因此,如果将队列拆分到不同的核心,您将获得更好的性能;如果您拥有rabbitmq集群,您也可以将他们拆分到不同的节点。

rabbitmq队列绑定到最初声明它们的节点。即使您创建了一个rabbitmq中间件集群,所有路由到特定队列的消息都将转到该队列所在的节点。您可以在节点之间平均地手动拆分队列,但缺点是您需要记住队列的位置。

如果您有多个节点或具有多个核心的单节点集群,我们建议使用两个插件来帮助您:

当您想要在生产者和消费者之间共享队列时,为队列命名是很重要的,但是如果您使用临时队列,则不重要。相反,您应该让服务器使用一个随机的队列名称,而不是你自己命名一个——或者修改rabbitmq策略。

客户机连接可能会失败,并可能留下未使用的资源(队列),留下许多队列可能会影响性能。自动删除队列有三种方法:

在 Erlang VM 的内部队列每个队列均使用用了一个优先级别,他们耗费了一些资源。在大多数情况下,不超过5个优先级就足够了。

一个常见的问题是如何处理发送到rabbitmq的消息的palyload(消息大小)。当然,您不应该在消息中发送非常大的文件信息,但是每秒的消息数是一个比它本身的消息大小更大的瓶颈。发送多个小消息可能是一个坏的选择。一个更好的办法是将它们捆绑成一个更大的消息,让消费者将其拆分。但是,如果捆绑多条消息,则需要记住这可能会影响处理时间。如果其中一条捆绑消息失败,是否需要重新处理所有这些消息?如何设置这个取决于带宽和体系结构。

每个连接使用大约100kb的RAM(如果使用TLS,甚至更多)。数千个连接可能是rabbitmq服务器的沉重负担。在最坏的情况下,服务器可能由于内存不足而崩溃。AMQP协议有一种称为“多路复用”的机制,它“复用”单个TCP连接。它建议每个进程只创建一个TCP连接,并在这个唯一一个连接的基础上为不同的线程使用多个通道。连接也应该是长连接的。AMQP连接的握手过程非常复杂,至少需要7个TCP数据包(如果使用了TLS,则需要更多)。

相反,如果需要,可以更频繁地打开和关闭通道。如果可能的话,甚至通道也应该是长寿命的,例如,在每个发布信息线程中复用相同的通道。每次发布信息时不用打开频道。最佳实践是复用连接,使用各通道在一个连接的基础上实现多路复用。理想情况下,每个进程只能有一个连接,然后在应用程序中为每个线程使用一个通道,而每个channel 复用同一个连接即可。

您还应该确保不在线程之间共享通道,因为大多数客户机不保证通道是线程安全的(因为这样会对性能产生严重的负面影响)。

确保不要在线程之间共享通道,因为大多数客户机不会使通道线程安全(因为这样会对性能产生严重的负面影响)。

为发布者和消费者区分连接以获得高吞吐量。当发布服务器向服务器发送太多要处理的消息时,rabbitmq可以对TCP连接施加反向压力。如果消费者使用相同的TCP连接,服务器可能不会从客户机接收消息确认。因此,消费性能也会受到影响。而随着消费速度的降低,服务器将不堪重负。

具有大量连接和通道的另一个影响为rabbitmq管理接口的性能。对于每个连接和通道性能,指标必须收集、分析和显示度量。

在连接失败的情况下,传输中的消息可能会丢失,并且可能需要重新传输此类消息。Acknowledgements 让服务器和客户机知道何时重新传输消息。客户机可以在收到消息时对其进行确认,也可以在客户机完全处理完消息后对其进行确认。Acknowledgement 具有性能影响,因此为了实现最快的吞吐量,应该禁用手动确认。

接收重要消息的消费应用程序在完成需要对其进行的任何操作之前不应确认消息,这样未处理的消息(工作进程崩溃、异常等)就不会丢失。

发布确认,是相同的事情,但用于发布。服务器收到来自发布服务器的消息时会进行确认。发布确认也会影响性能。但是,应该记住,如果发布者至少需要处理一次消息,就需要这样做。

所有未确认的消息必须驻留在服务器上的RAM中。如果您有太多未确认的消息,您将耗尽内存。限制未确认消息的一个有效方法是客户端预取的消息数做出相关设置。在预取部分了解有关预取的更多信息。

如果您不能承受丢失任何消息的代价,请确保您的队列声明为“持久”,并且您的消息以传递模式“持久”发送。

为了避免在中间件中丢失消息,需要为中间件重新启动、中间件硬件故障或中间件崩溃时做好准备。为了确保消息和中间件定义在重新启动后仍然存在,我们需要确保它们在磁盘上。在中间件重新启动期间,不持久的消息、交换和队列将会被丢失。

持久性消息更重,因为它们必须写入磁盘。请记住,即使您发送的是临时消息,懒惰的队列也会对性能产生相同的影响。对于高性能-请使用瞬态消息。

您可以通过amqps连接到rabbitmq,这是用tls包装的amqp协议。由于所有流量都必须加密和解密,因此TLS会影响性能。为了获得最大的性能,我们建议使用vpc对等,那么流量是私有的,并且是独立的,不涉及AMQP客户机/服务器。

在cloudamqp中,我们将rabbitmq服务器配置为只接受快速但安全的加密密码并确定其优先级。

预取值用于指定多少条消息将同时被发送给消费者。它被用来从你的消费者那里得到尽可能多的东西(饱和工作)。

From R******.com: “The goal is to keep the consumers saturated with work, but to minimise the client"s buffer size so that more messages stay in Rabbit"s queue and are thus available for new consumers or to just be sent out to consumers as they become free.”

来自r******.com:“我们的目标是让消费者饱和工作,但要最大限度地减小客户机的缓冲区大小,因此更多的消息被留在Rabbit的队列中,从而对新的消费者可用,或者发送给那些变得空闲的消者。”

rabbitmq的默认预取设置为客户端提供了一个不受限制的缓冲区,这意味着rabbitmq在默认情况下会将尽可能多的消息发送给任何看起来准备接受它们的客户机。发送的消息由rabbitmq客户端库(在使用者中)缓存,直到对其进行处理。预取限制了在确认消息之前客户端可以接收的消息数。所有预取的消息都将从队列中删除,并且对其他使用者不可见。

A too small prefetch count may hurt performance since RabbitMQ is most of the time waiting to get permission to send more messages. The image below is illustrating long idling time. In the example, we have a QoS prefetch setting of 1. This means that RabbitMQ won"t send out the next message until after the round trip completes (deliver, process, acknowledge). Round time in this picture is in total 125ms with a processing time of only 5ms.

预取数太小可能会影响性能,因为rabbitmq大多数时间都在等待获得发送更多消息的许可。下图显示的是长时间的空转时间。在本例中,QoS预取设置为1。这意味着rabbitmq在往返完成(传递、处理、确认)之前不会发送下一条消息。图片中的整个周期时间总共为125ms,处理时间仅为5ms。

另一方面,大量的预取数可以接收队列中的大量消息并将其传递给同一个消费者,但是其他使用者却处于空闲状态。

如果您有一个或几个消费者快速处理消息,我们建议您一次预取多个消息。尽量让你的客户端繁忙。如果您一直有大约相同的处理时间,并且网络行为保持不变-您只需在客户机上为每个消息计算总的往返时间/处理时间,即可获得估计的预取值。

如果您有许多消费者,并且处理时间很短,我们建议预取值设置的应该比单个或少数使用者要低一些。太低的值会让消费者空转很多,因为他们需要等待消息到达。过高的值可能会使一个消费者忙碌,而其他消费者则处于空闲状态。

如果您有许多使用者和/或处理时间较长,我们建议您将预取计数设置为1,以便消息在所有消费者中均匀分布。

请注意,如果客户端自动确认消息,则预取值将不起作用。

一个典型的错误是有一个无限的预取,其中一个客户机接收所有的消息,耗尽内存并崩溃,然后所有的消息都被重新传递。

有关rabbitmq预取的信息,请参阅推荐的rabbitmq文档。

HIPE将以增加启动时间为代价增加服务器吞吐量。启用HIPE时,将在启动时编译rabbitmq。根据我们的基准测试,吞吐量增加了20-80%。HIPE的缺点是启动时间也增加了很多,大约1-3分钟。在rabbitmq的文档中,hipe仍然被标记为实验性的。

如果您需要高可用性,请不要启用HIPE。

当您用一个节点创建一个cloudamqp实例时,您将得到一个具有高性能的单个节点。一个节点将为您提供 最高的性能 ,因为消息不需要在多个节点之间进行镜像。

当您使用两个节点创建一个CloudAMQP实例时,与单个节点的相比,您将获得一半的性能。节点位于不同的可用性区域,队列在可用性区域之间自动镜像。两个节点将为您提供 高可用性 ,因为一个节点可能崩溃或被标记为受损,但另一个节点仍将启动并运行,准备接收消息。

当您使用三个节点创建一个CloudAMQP实例时,与单个节点的相同计划大小相比,您将获得1/4的性能。节点位于不同的可用性区域,队列在可用性区域之间自动镜像。您也可以暂停少数组件-与允许每个节点响应相比,通过关闭少数组件,您减少了重复传递。暂停少数组件是三节点集群中的一种分区处理策略,它可以防止由于网络拆分而导致数据不一致。

我们在cloudamqp集群中注意到的一个常见错误是,用户创建了一个新的vhost,但忘记为新的vhost启用一个ha策略。如果没有HA策略,则不会在节点之间同步消息。

直接交换是最快速。如果有许多bindings ,rabbitmq必须计算将消息发送到何处。

有些插件可能非常好用,但它们可能会消耗大量的CPU或RAM。因此,不建议将它们用于生产服务器。确保禁用不使用的插件。您可以通过CloudAmqp中的控制面板启用许多不同的插件。

将rabbitmq管理统计速率模式设置为detailed会严重影响性能,不应在生产中使用。

确保您使用的是最新推荐的客户端库版本

保持最新稳定版本的rabbitmq和erlang。在为客户发布新的主要版本之前,我们通常会在很大程度上对其进行测试。请注意,在为新集群选择版本的下拉列表中,我们始终使用最推荐的版本作为所选选项(默认)。

Dead lettering和TTL是rabbitmq中的两个流行功能,应该谨慎使用。TTL和Dead lettering可以产生您没有预料到的性能影响。

使用x-dead-letter-exchange属性声明的队列将向指定的dead-letter-exchange 发送被拒绝、非确认或过期(带有ttl)的消息。如果您指定了x-dead-letter-routing-key,则消息的路由键将在dead lettered时更改。

通过使用x-message-ttl属性声明队列,如果消息在指定的时间内未被使用,则将从队列中丢弃消息。

相关推荐

c++如何定义一个队列

C++ Queues(队列)C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回真3.front() 返回第一个元素4.pop() 删除第一个元素5.push() 在末尾加入一个元素6.size() 返回队列中元素的个数队列可以用线性表(list)或双向队列(deque)来实现(注意vector container 不能用来实现queue,因为vector 没有成员函数pop_front!):queue<list<int>> q1;queue<deque<int>> q2;其成员函数有“判空(empty)” 、“尺寸(Size)” 、“首元(front)” 、“尾元(backt)” 、“加入队列(push)” 、“弹出队列(pop)”等操作。例: int main() { queue<int> q; q.push(4); q.push(5); printf("%d ",q.front()); q.pop(); return 0; }
2023-08-14 03:05:241

英语 (cut/push/wait) in line可以加the吗? (jump/cut/wait) the queue 这the是必须的么,不特指也需要吗?

1.是固定的,不能加the2.(jump/cut/wait) the queue 这个the是必须的wait后面可以加in
2023-08-14 03:05:342

英语message queue怎么翻译?

messsage queue 含义是 信息队列,属于计算机专业术语。
2023-08-14 03:05:459

ROS路由器里Queues选项里有一台机器变灰色,而且前面还有个X符号,请高手们指点,这是什么个意思?

一般队列当中出现的IP地址或是计算机名称都是曾经与与路由器进行连接的,如果队列当中的IP地址或是计算机名称为灰色,则表示它已经失去与路上器的连接!
2023-08-14 03:06:111

java队列实现异步执行

你想问什么呢?判断队列是否有值?取队列中的值?这两个问题你能完成的话还有啥需要解决呢?跟你以前的需求不一样么?
2023-08-14 03:06:221

讨论下ROS的QUEUES和PCQ限速哪个较完美!

不是哪个好哪个不好的问题。。。看你的环境设置的。
2023-08-14 03:06:311

ROS ARP绑定、simple queues限速

=1/8×5/2×32=10
2023-08-14 03:06:492

向队列中插入元素的操作是(数据结构填空题)

C++ Queues 队列:先进先出back() 返回最后一个元素 empty() 如果队列空则返回真 front() 返回第一个元素 pop() 删除第一个元素 push() 在末尾加入一个元素 size() 返回队列中元素的个数
2023-08-14 03:07:001

请教php+redis实现任务队列的思路

// 创建请求ID标志, uniqid 无法保证唯一, 自己去搜索生成唯一的方法$uuid = uniqid();$tsk_name = "mytask";$time_out = 30000; // 超时策略: 30秒$time_start = time();$redis->rPush($tsk_name, $uuid); // 右(后)插入队列// 堵塞等待队列中第一个和$uuid匹配的(到我了)while($uuid != $redis->lGet($tsk_name, 0)){ if((time()-$time_start)> $time_out) { break; // 超时跳出(某些原因队列异常了, 可能永远取不到) } usleep(10); // sleep 10ms, 再次尝试}// 这里执行任务的处理代码....// $response 已拼装好要返回的内容// 处理完成后(数据库等已入库更新), 需要:if($redis->lGet($tsk_name, 0) == $uuid){ // 再次确认第一个是本请求 $redis->lPop($tsk_name); // 完成任务了, 从队列中移除}else{ // 出现这种情况, 是因为超时了, 或前面的$uuid没有被消费 // 若不清除, 后续的请求, 都将无法正常进入队列执行 // 取队列中的所有$uuid $queues = $redis->lRange($tsk_name, 0, -1); foreach($queues as $i=>$uid){ if($uid==$uuid){
2023-08-14 03:07:221

想做个Ros5.25的动态限速脚本,请高手帮助!

ROS5.25有破解版,好用稀稳定。本人正在使用
2023-08-14 03:07:311

ros怎么查看每一个IP的流量

Winbox-》tools-》torch
2023-08-14 03:07:503

葡萄酒怎样才能提纯?

自酿葡萄酒发酵结束以后进行倒一下瓶,补一下二氧化硫,然后就密封静置。过大概1-2个月,在自然作用下会在底部形成一层结实的沉淀层,然后用吸管或者橡皮管把上层清液分离到另外一个瓶子中静至。在过2-3个月也许还会在底部形成少量的沉淀,那就再采用上述方法分离。然后你的酒就比较澄清了。因为是自酿酒,所以就不介绍你采取下胶、过滤等方法了。自然澄清比较好。呵呵
2023-08-14 03:08:076

C语言如何把一段缓冲区包装为一个文件?

这个我觉得不可能!C语言中的文件分为两类:设备文件和磁盘文件!设备文件通常是硬件,如stdin为标准输入设备文件——键盘,stdout为标准输出设备文件——显示器。磁盘文件即传统意义上的文件!C 语言中可供我们操作的空间除了程序内存中的栈,剩下的就是堆了!但即使能够分配一个名义上似乎为文件的堆,问题是文件必须正确打开才能使用!再者,如果一个文件只能在程序运行时才能存在于内存,那么这个文件就没有文件应有的价值!完全可以用其他的来取代的!当然有!C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), lists(链表), 和 stacks(栈)等.
2023-08-14 03:08:231

源码修炼笔记之Dubbo线程池策略

FixedThreadPool FixThreadPool内部是通过ThreadPoolExecutor来创建线程,核心线程数和最大线程数都是上下文中指定的线程数量threads,因为不存在空闲线程所以keepAliveTime为0, 当queues=0,创建SynchronousQueue阻塞队列; 当queues<0,创建无界的阻塞队列LinkedBlockingQueue; 当queues>0,创建有界的阻塞队列LinkedBlockingQueue。 采用dubbo自己实现的线程工厂NamedInternalThreadFactory,将线程置为守护线程(Demon) 拒绝策略为AbortPolicyWithReport,策略为将调用时的堆栈信息保存到本地文件中,并抛出异常RejectedExecutionException CachedThreadPool CachedThreadPool与FixedThreadPool的区别是核心线程数和最大线程数不相等,通过alive来控制空闲线程的释放 LimitedThreadPool LimitedThreadPool与CachedThreadPool的区别是空闲线程的超时时间为Long.MAX_VALUE,相当于线程数量不会动态变化了,创建的线程不会被释放。 EagerThreadPool 与上述三种线程池不同,EagerThreadPool并非通过JUC中的ThreadPoolExecutor来创建线程池,而是通过EagerThreadPoolExecutor来创建线程池,EagerThreadPoolExecutor继承自ThreadPoolExecutor,实现自定义的execute方法,采用的阻塞队列是TaskQueue,TaskQueue继承自LinkedBlockingQueue。 execute方法首先调用ThreadPoolExecutor的execute方法,如果执行失败会重新放入TaskQueue进行重试。 实现自定义的ThreadPool ThreadPool被定义为一个扩展点,如下所示, 其默认实现是FixedThreadPool,可以通过实现该扩展来实现自定义的线程池策略。
2023-08-14 03:08:311

一个很难的英语句子结构分析----------务必高手进

However, the tendency of markets to replace queues, and other non-market ways of allocating goods is so common in modern life that we scarcely notice it anymore. however :然而 (副词作状语)the tendency of markets to replace queues :取代队列的市场趋势(动词不定时作后置定语)and other non-market ways of allocating goods:分配货物的其他非市场方式 (OF+动名词短语作后置定语)is so common :是如此常见 (SO .....THAT 句子结构, 如此....以致于)in modern life that we scarcely notice it any more 在现代生活当中,以致于我们几乎不再注意到它
2023-08-14 03:08:401

windows怎么测试rabbitmq

AMQP(高级消息队列协议) 是一个异步消息传递所使用的应用层协议规范,作为线路层协议,而不是API(例如JMS),AMQP 客户端能够无视消息的来源任意发送和接受信息。AMQP的原始用途只是为金融界提供一个可以彼此协作的消息协议,而现在的目标则是为通用消息队列架构提供通用构建工具。因此,面向消息的中间件 (MOM)系统,例如发布/订阅队列,没有作为基本元素实现。反而通过发送简化的AMQ实体,用户被赋予了构建例如这些实体的能力。这些实体也是规范的一 部分,形成了在线路层协议顶端的一个层级:AMQP模型。这个模型统一了消息模式,诸如之前提到的发布/订阅,队列,事务以及流数据,并且添加了额外的特性,例如更易于扩展,基于内容的路由。AMQP当中有四个概念非常重要virtual host,虚拟主机exchange,交换机queue,队列binding,绑定一个虚拟主机持有一组交换机、队列和绑定。为什么需要多个虚拟主机呢?因为RabbitMQ当中,用户只能在虚拟主机的粒度进行权限控制。因此,如果需要禁止A组访问B组的交换机/队列/绑定,必须为A和B分别创建一个虚拟主机。每一个RabbitMQ服务器都有一个默认的虚拟主机/。何谓虚拟主机(virtual host),交换机(exchange),队列(queue)和绑定(binding)队列(Queues)是你的消息(messages)的终点,可以理解成装消息的容器。消息就一直在里面,直到有客户端(也就是消费者,Consumer)连接到这个队列并且将其取走为止。不过,也可以将一个队列配置成这样的:一旦消息进入这个队列,此消息就被删除。队列是由消费者(Consumer)通过程序建立的,不是通过配置文件或者命令行工具。这没什么问题,如果一个消费者试图创建一个已经存在的队列,RabbitMQ会直接忽略这个请求。因此我们可以将消息队列的配置写在应用程序的代码里面。而要把一个消息放进队列前,需要有一个交换机(Exchange)。交换机(Exchange)可以理解成具有路由表的路由程序。每个消息都有一个称为路由键(routing key)的属性,就是一个简单的字符串。交换机当中有一系列的绑定(binding),即路由规则(routes)。(例如,指明具有路由键 “X” 的消息要到名为timbuku的队列当中去。)消费者程序(Consumer)要负责创建你的交换机。交换机可以存在多个,每个交换机在自己独立的进程当中执行,因此增加多个交换机就是增加多个进程,可以充分利用服务器上的CPU核以便达到更高的效率。例如,在一个8核的服务器上,可以创建5个交换机来用5个核,另外3个核留下来做消息处理。类似的,在RabbitMQ的集群当中,你可以用类似的思路来扩展交换机一边获取更高的吞吐量。交换机如何判断要把消息送到哪个队列?你需要路由规则,即绑定(binding)。一个绑定就是一个类似这样的规则:将交换机“desert(沙漠)”当中具有路由键“阿里巴巴”的消息送到队列“hideout(山洞)”里面去。换句话说,一个绑定就是一个基于路由键将交换机和队列连接起来的路由规则。例如,具有路由键“audit”的消息需要被送到两个队列,“log-forever”和“alert-the-big-dude”。要做到这个,就需要创建两个绑定,每个都连接一个交换机和一个队列,两者都是由“audit”路由键触发。在这种情况下,交换机会复制一份消息并且把它们分别发送到两个队列当中。交换机不过就是一个由绑定构成的路由表。交换机有多种类型。他们都是做路由的,但是它们接受不同类型的绑定。为什么不创建一种交换机来处理所有类型的路由规则呢?因为每种规则用来做匹配分子的CPU开销是不同的。例如,一个“topic”类型的交换机试图将消息的路由键与类似“dogs.*”的模式进行匹配。匹配这种末端的通配符比直接将路由键与“dogs”比较(“direct”类型的交换机)要消耗更多的CPU。如果你不需要“topic”类型的交换机带来的灵活性,你可以通过使用“direct”类型的交换机获取更高的处理效率。
2023-08-14 03:09:021

如何获取activeMQ上的所有topic

在5.1.0之后可使用以下代码进行queues或topics队列获取.DestinationSource destinationSource = connection.getDestinationSource(); Set<ActiveMQQueue> queues = destinationSource.getQueues(); Set<ActiveMQTopic> topics = destinationSource.getTopics()
2023-08-14 03:09:111

WINBOX怎么样限速?

登陆winbox,选择左侧的"Queues",在右边点击Simple Queues选项卡,下面出现的就是每台机器的限速情况,点击任何一台机器,会出现Simple Queues<机器名>对话框,再选择General选项卡,下面的Max Linit(tx/rx)右边的文本框里填写了限制的速度。你可以根据自己需要更改
2023-08-14 03:09:221

RPS和RFS网卡多队列性能调优实践

为了解决LVS ksoftirqd CPU使用率100%导致网卡软中断丢包,我和同事们一起搜索了大量的资料去分析问题,特别是感谢美团技术团队的分享帮助我们快速梳理优化思路,最后明确了如何重构RPS和RFS网卡多队列的优化脚本。个人认为这是一个大家可能普遍会遇到的问题,文章内的分析思路和解决方案未必是最优解,也欢迎各位分享自己的解决方法。 2019年07月03日 - 初稿 阅读原文 - https://wsgzao.github.io/post/rps/ 扩展阅读 Redis 高负载下的中断优化 - https://tech.meituan.com/2018/03/16/redis-high-concurrency-optimization.html 我们遇到的问题属于计划外的incident,现象是某产品用户在线率突然降低,LVS Master同时收到CPU High Load告警,检查发现该节点出现网卡大量断开重连和丢包情况,应急切换到LVS Slave也出现上述问题,在排除掉流量异常和外部攻击后选择切换DNS到背后的Nginx Real Servers后服务逐步恢复。 复盘核心原因在于系统初始化时rps优化脚本没有成功执行,这个脚本起初是因为早期DBA团队遇到过CPU负载较高导致网卡异常,这个优化脚本也一直传承至今,却已经没有人知道为什么添加。现在大多数服务器没有执行成功而被大家一直所忽视显然也是post check没有做到位。在早期大家都停留在Bash Shell运维的阶段,没有专职的团队来管理确实容易失控,好在现在可以基于Ansible来做初始化和检查,运维的压力也减轻了一部分。 通过Google搜索相关知识的过程中,我们也发现在不少人都会遇到这样类似的问题。比如这篇文章提到 lvs/irq lvs 的性能问题,软中断耗尽 CPU 单核后到达处理极限 和华为的工程师们在交换经验的时候对方分享了一个关于RSS和RPS关系图,之后的内容还会引用美团技术团队的分析 我们遇到的情况是缺少可用服务器资源选择把用户外部请求流量和Codis Cache Cluster内部流量临时混在了同一个LVS上,虽然看上去CPU和traffic的整体压力都不算高,但是CPU的处理压力可能恰好集中在了和外网Bond1网卡相同的Core上最后引起了ksoftirqd软中断,而内网Bond0网卡就没有监控到任何丢包。虽然我们也有正常开启 irqbalance ,但不清楚是不是因为受到 cpupower performance 和 NUMA 的影响最后也没能阻止事故的发生,最终的优化方案主要是手动开启RPS和RFS,大致步骤如下: This document describes a set of complementary techniques in the Linux networking stack to increase parallelism and improve performance for multi-processor systems. The following technologies are described: https://www.kernel.org/doc/Documentation/networking/scaling.txt RECEIVE PACKET STEERING (RPS) Receive Packet Steering (RPS) is similar to RSS in that it is used to direct packets to specific CPUs for processing. However, RPS is implemented at the software level, and helps to prevent the hardware queue of a single network interface card from becoming a bottleneck in network traffic. RPS has several advantages over hardware-based RSS: RPS is configured per network device and receive queue, in the /sys/class/net/*device*/queues/*rx-queue*/rps_cpus file, where device is the name of the network device (such as eth0 ) and rx-queue is the name of the appropriate receive queue (such as rx-0 ). The default value of the rps_cpus file is zero. This disables RPS, so the CPU that handles the network interrupt also processes the packet. To enable RPS, configure the appropriate rps_cpus file with the CPUs that should process packets from the specified network device and receive queue. The rps_cpus files use comma-delimited CPU bitmaps. Therefore, to allow a CPU to handle interrupts for the receive queue on an interface, set the value of their positions in the bitmap to 1. For example, to handle interrupts with CPUs 0, 1, 2, and 3, set the value of rps_cpus to 00001111 (1+2+4+8), or f (the hexadecimal value for 15). For network devices with single transmit queues, best performance can be achieved by configuring RPS to use CPUs in the same memory domain. On non-NUMA systems, this means that all available CPUs can be used. If the network interrupt rate is extremely high, excluding the CPU that handles network interrupts may also improve performance. For network devices with multiple queues, there is typically no benefit to configuring both RPS and RSS, as RSS is configured to map a CPU to each receive queue by default. However, RPS may still be beneficial if there are fewer hardware queues than CPUs, and RPS is configured to use CPUs in the same memory domain. RECEIVE FLOW STEERING (RFS) Receive Flow Steering (RFS) extends RPS behavior to increase the CPU cache hit rate and thereby reduce network latency. Where RPS forwards packets based solely on queue length, RFS uses the RPS backend to calculate the most appropriate CPU, then forwards packets based on the location of the application consuming the packet. This increases CPU cache efficiency. RFS is disabled by default. To enable RFS, you must edit two files: /proc/sys/net/core/rps_sock_flow_entries Set the value of this file to the maximum expected number of concurrently active connections. We recommend a value of 32768 for moderate server loads. All values entered are rounded up to the nearest power of 2 in practice. /sys/class/net/*device*/queues/*rx-queue*/rps_flow_cnt Replace device with the name of the network device you wish to configure (for example, eth0 ), and rx-queue with the receive queue you wish to configure (for example, rx-0 ). Set the value of this file to the value of rps_sock_flow_entries divided by N , where N is the number of receive queues on a device. For example, if rps_flow_entries is set to 32768 and there are 16 configured receive queues, rps_flow_cnt should be set to 2048 . For single-queue devices, the value of rps_flow_cnt is the same as the value of rps_sock_flow_entries . Data received from a single sender is not sent to more than one CPU. If the amount of data received from a single sender is greater than a single CPU can handle, configure a larger frame size to reduce the number of interrupts and therefore the amount of processing work for the CPU. Alternatively, consider NIC offload options or faster CPUs. Consider using numactl or taskset in conjunction with RFS to pin applications to specific cores, sockets, or NUMA nodes. This can help prevent packets from being processed out of order. 接收数据包是一个复杂的过程,涉及很多底层的技术细节,但大致需要以下几个步骤: NIC 在接收到数据包之后,首先需要将数据同步到内核中,这中间的桥梁是 rx ring buffer 。它是由 NIC 和驱动程序共享的一片区域,事实上, rx ring buffer 存储的并不是实际的 packet 数据,而是一个描述符,这个描述符指向了它真正的存储地址,具体流程如下: 当驱动处理速度跟不上网卡收包速度时,驱动来不及分配缓冲区,NIC 接收到的数据包无法及时写到 sk_buffer ,就会产生堆积,当 NIC 内部缓冲区写满后,就会丢弃部分数据,引起丢包。这部分丢包为 rx_fifo_errors ,在 /proc/net/dev 中体现为 fifo 字段增长,在 ifconfig 中体现为 overruns 指标增长。 这个时候,数据包已经被转移到了 sk_buffer 中。前文提到,这是驱动程序在内存中分配的一片缓冲区,并且是通过 DMA 写入的,这种方式不依赖 CPU 直接将数据写到了内存中,意味着对内核来说,其实并不知道已经有新数据到了内存中。那么如何让内核知道有新数据进来了呢?答案就是中断,通过中断告诉内核有新数据进来了,并需要进行后续处理。 提到中断,就涉及到硬中断和软中断,首先需要简单了解一下它们的区别: 当 NIC 把数据包通过 DMA 复制到内核缓冲区 sk_buffer 后,NIC 立即发起一个硬件中断。CPU 接收后,首先进入上半部分,网卡中断对应的中断处理程序是网卡驱动程序的一部分,之后由它发起软中断,进入下半部分,开始消费 sk_buffer 中的数据,交给内核协议栈处理。 通过中断,能够快速及时地响应网卡数据请求,但如果数据量大,那么会产生大量中断请求,CPU 大部分时间都忙于处理中断,效率很低。为了解决这个问题,现在的内核及驱动都采用一种叫 NAPI(new API)的方式进行数据处理,其原理可以简单理解为 中断 + 轮询,在数据量大时,一次中断后通过轮询接收一定数量包再返回,避免产生多次中断。 由于接收来自外围硬件 (相对于 CPU 和内存) 的异步信号或者来自软件的同步信号,而进行相应的硬件、软件处理;发出这样的信号称为进行中断请求 (interrupt request, IRQ) 1.top 按下数字键 1 2.mpstat -P ALL 2 mpstat使用介绍和输出参数详解 - https://wsgzao.github.io/post/mpstat/
2023-08-14 03:09:311

RabbitMQ笔记十三:使用@RabbitListener注解消费消息

之前的博客中我们可以在spring容器中构建 SimpleMessageListenerContainer 来消费消息,我们也可以使用 @RabbitListener 来消费消息。 定义消息处理器, @RabbitListener 注解标记的方法 应用启动类, @EnableRabbit 启用 @RabbitListener 测试: 控制台打印: 如果发送的消息 content_type 的属性是 text ,那么接收的消息处理方法的参数就必须是 String 类型,如果是 byte[] 类型就会报错。 控制台报错 总结 如果消息属性中没有指定 content_type ,则接收消息的处理方法接收类型是 byte[] ,如果消息属性中指定 content_type为text ,则接收消息的处理方法的参数类型是 String 类型。不管有没有指定 content_type ,处理消息方法的参数类型是Message都不会报错。 步骤 具体的消息处理方法的参数是跟 MessageConverter 转换后的java对象有关。 如果想要设置 MessageConverte r,则需要在 RabbitListenerContainerFactory 的实例中去设置,( setMessageConverter 方法) 获取单一个Header的属性,Header还有其他的一些属性,比如 required , defaultvalue 等属性,顾名思义: 配置文件: 启动类: 定义mq中不存在的 Queue , exchange 和 route key 从上面的我们知道声明必须容器中要有 RabbitAdmin 和 RabbitTemplate 实例 应用启动类 测试验证 控制台打印: 说明自动声明的绑定中的队列被自动默认监听。 @RabbitListener 注解中的 bindings 和 queues 参数不能同时指定,否则会报错。 @RabbitListener 可以标注在类上面,当使用在类上面的时候,需要配合 @RabbitHandler 注解一起使用, @RabbitListener 标注在类上面表示当有收到消息的时候,就交给带有 @RabbitHandler 的方法处理,具体找哪个方法处理,需要跟进 MessageConverter 转换后的java对象。 配置: 处理器方法 应用启动类: 发送不包含content_type属性的消息和content_type属性为text的消息,控制台打印: @RabbitListener 注解的 containerFactory 属性可以指定一个 RabbitListenerContainerFactory 的bean,默认是找名字为 rabbitListenerContainerFactory 的实例。 当我们将 ConsumerConfig 类中的 RabbitListenerContainerFactory 实例的对象名改掉的时候,发现就会报错。 此时控制台上报错, 此时如果配置一下 @RabbitListener 注解的 containerFactory 属性便不会报错。 我们再去改造一下在 RabbitListenerContainerFactory 实例中定义消息类型转换器 User对象: 在处理器中增加参数是User的方法:
2023-08-14 03:09:391

软路由如何设置?

在路由后面有个洞拿牙签桶一下默认地址:192.168.0.1/192.168.1.1默认帐号:admin密码可能一样或者是空的然后根据设置向导进行设置
2023-08-14 03:09:493

unity3d 如何制作横版游戏

如果对楼主有帮助,给个采纳好不,谢谢啦首先,在场景中添加一个Cube,添加为预制件。创建一个脚本,在脚本中写入下面的代码:using UnityEngine;using System.Collections;using System.Collections.Generic;public class qianjing : MonoBehaviour{public Transform prefab;//定义预制件public Vector3 onepos;//定义起始位置public Vector3 nextpos;//定义下一个位置public int num;//数量public Vector3 minsize;//最小范围public Vector3 maxsize;//最大范围Queue<Transform> queues;//队列public float distance;void Start(){queues = new Queue<Transform>(num);//实例化队列for (int i = 1; i < num; i++){Transform trans = GameObject.Instantiate(prefab);//实例化预制件queues.Enqueue(trans);//将预制件添加至队列}nextpos = onepos;//起始位置 = 下一位置for (int i = 1; i < num; i++){Keep();}}void Update(){if (Run.distances - queues.Peek().position.x >= distance)//物体移动距离与预制件长度的差{Keep();}}/// <summary>/// 预制件排列/// </summary>private void Keep(){//(预制件)随机大小Vector3 ban = new Vector3(Random.Range(minsize.x, maxsize.x), Random.Range(minsize.y, maxsize.y), Random.Range(minsize.z, maxsize.z));Transform trans = queues.Dequeue();//暂时移除(预制件)Vector3 poss = nextpos;//获取下一个预制件poss.y += ban.y * 0.5f;//预制件在Y轴方向上移预制件的一半距离poss.x += ban.x * 0.5f;//预制件在X轴方向右移预制件的一半距离trans.localScale = ban;//重新生成随机预制件trans.position = poss;//获取下一个预制件位置nextpos.x += ban.x;// 预制件在X轴方向右移(前)预制件大小的距离queues.Enqueue(trans);//添加队列中}}返回场景,创建一个空游戏体,将脚本挂载在空游戏体上点击运行,在游戏窗口就可以看到随机产生的游戏路径。
2023-08-14 03:10:151

管理端是什么意思

web管理端,指的是erlang的cowboy框架进行开发。web页面包括Overview(概述)、Connections(连接)、Channels(通道)、Exchanges(交换器)、Queues(队列)、Admin(用户管理)。
2023-08-14 03:10:511

一个很难的英语句子结构分析----------务必高手进

However,the tendency of markets to replace queues,and other non-market ways of allocating goods is so mon in modern life that we scarcely notice it anymore. however :然而 (副词作状语) the tendency of markets to replace queues :取代队列的市场趋势(动词不定时作后置定语) and other non-market ways of allocating goods:分配货物的其他非市场方式 (OF+动名词短语作后置定语) is so mon :是如此常见 (SO .THAT 句子结构,如此.以致于) in modern life that we scarcely notice it any more 在现代生活当中,以致于我们几乎不再注意到它
2023-08-14 03:11:001

如何获取activeMQ上的所有topic

在5.1.0之后可使用以下代码进行queues或topics队列获取.DestinationSource destinationSource = connection.getDestinationSource(); Set<ActiveMQQueue> queues = destinationSource.getQueues(); Set<ActiveMQTopic> topics = destinationSource.getTopics();
2023-08-14 03:11:071

交换机可以分网线吗?

只是交换机,没有路由的话,速度可能会慢点
2023-08-14 03:11:199

ROS PPPOE限速

假设PPPOEserver是可以通过组来限速和通过账号来限速的在PPP里Profiles里的Ratelimti可以限速也可以在secrets账号里限速两个方法都可以实现,区别是组里设置号以后,只要在这个组里的账号都采用这个策略,账号里限制更加灵活一点,如果账号比较多建议采用组,如果账号比较少建议采用用户模式
2023-08-14 03:11:472

如何获取activeMQ上的所有topic

在5.1.0之后可使用以下代码进行queues或topics队列获取.DestinationSource destinationSource = connection.getDestinationSource(); Set<ActiveMQQueue> queues = destinationSource.getQueues(); Set<ActiveMQTopic> topics = destinationSource.getTopics();
2023-08-14 03:11:541

如何判断通过程序插入oracle是否成功?

rhtrjytrruykik
2023-08-14 03:12:033

谁能教我winbox怎样做限速

登陆winbox,选择左侧的"Queues",在右边点击Simple Queues选项卡,下面出现的就是每台机器的限速情况,点击任何一台机器,会出现Simple Queues<机器名>对话框,再选择General选项卡,下面的Max Linit(tx/rx)右边的文本框里填写了限制的速度。你可以根据自己需要更改
2023-08-14 03:12:121

oracle问题。 简述shareplex工作原理。

1 体系结构, 3 queues and 4 processesRedo Log/archived log -->Capture process -->capure queue--> Read Process--> Export queue-->NETWORK-->Import process-->Post queue-->Post Process-->target DB我的测试环境:ndb1:XE -----> ndb3:DEMO2 源端进程sp_cop --> sp_ocap, sp_ordr, sp_xportCature Process(sp_ocap)从redo logs/arch logs中读取active config中变化的数据,写到capture queue每个data source有个capure processReader Process(sp_ordr)从capture queue读取数据,加上路由信息写到export queue每个data source有个read processExport Process(sp_xport)跟每个target建立一个TCP/IP连接,并从export queue读取数据,把数据传到目的端每个source-target对都有一个Export Process3目的端进程ps -fu qustsp_cop --> sp_pst_mt, sp_mport 0xc0a86e66+PI+ndb1+sp_mport+0xc0a86e65 RImport Process(sp_mport)与每个source建立一个TCP/IP连接,接受数据写到post queue中每个source-target对都有一个Import ProcessPost Process(sp_post_mt)从post queue中读取数据,apply到目标数据库中每个post queue都有一个Post Processs4网络端口lsof -i :2100源端:sp_cop TCP ndb1.test:2100 (LISTEN)sp_xport TCP ndb1.test:34347->ndb3.test:2100 (ESTABLISHED)目的端:sp_cop TCP ndb3.test:2100 (LISTEN)sp_mport TCP ndb3.test:2100->ndb1.test:34347 (ESTABLISHED)sp_mport TCP ndb3.test:2100->ndb1.test:34347 (ESTABLISHED)sp_cop在2端都监听2100端口sp_xport连接到源端2100端口,只有一个连接sp_mport连接到目的端 2100端口, 有2个连接5 Oracle的连接(正常工作状态)SQL> select username,module from v$session where username is not null order by 1,2;源端:QUEST sp_ocap@ndb1.test (TNS V1-V3)QUEST sp_ordr@ndb1.test (TNS V1-V3)QUEST sp_ordr@ndb1.test (TNS V1-V3)QUEST sp_ordr@ndb1.test (TNS V1-V3)QUEST sp_ordr@ndb1.test (TNS V1-V3)QUEST sp_ordr@ndb1.test (TNS V1-V3)QUEST sp_ordr@ndb1.test (TNS V1-V3)QUEST sp_ordr@ndb1.test (TNS V1-V3)QUEST sp_ordr@ndb1.test (TNS V1-V3)目的端:QUEST Post-2100-ndb1-XEQUEST sp_opst_mt@ndb3.test (TNS V1-V3)6 queue的情况qview list源端:o.XE+CWRITER +PA+o.XE+sp_ocap+o.XEREADER +PR+o.XE+sp_ordr+o.XEndb1+XWRITER +PR+o.XE+sp_ordr+o.XEREADER +PX+ndb1+sp_xport+0xc0a86e66 (192.168.110.102)Capture Queue(+C)用于快速存放捕捉道德变化数据每个Oracle实例只有一个cature queue,用Oracle_SID命名:O.{ORACLE_SID}Export Queue(+X)用于存放加上路由的数据缺省,一个Host/Server只有一个Export queue(多个Oracle实例共用),用hostname命名:{hostname}用named export queue来实行每个实例用独立的queue目的端:ndb1+P+o.XE-o.DEMOsubqueues range from 0 to 3WRITER +PI+ndb1+sp_mport+0xc0a86e65 (192.168.110.101)READER +PP+ndb1+sp_opst_mt+o.XE-o.DEMOPostQueue(+P)用于存放收到的数据每个source-target对都有一个Post Queue,以两个Oracle实例来命名:O.{SRC_SID}-O.{DEST_SID}再看目的端post进程的参数sp_mport 0xc0a86e66+PI+ndb1+sp_mport+0xc0a86e65 Rqueue是源端export queue的reader+目的端post queue的writer
2023-08-14 03:12:201

求英语翻译

专业水平的工作能力履行所有诈骗子部门。 酌情决定的能力的基础上研究。一定程度的创造力和纬度需要。 熟练运用先进的管理工具、相似反应,攻击,伊格尔、PayPal内部网,微软办公软件。 学习能力和适应新的软件技术。 通过电话进行有效沟通的能力,利用积极的聆听和清晰的客户交谈。 良好的沟通能力,利用通过电子邮件传送正确文法和标点符号上的技巧。 成熟的紧迫感和跟进。 开发和维护专业能力与同事的工作关系。
2023-08-14 03:12:311

英语翻译

亲爱的爸爸妈妈: 今年夏天送我来英国学英语真是送对了。在这里我认识了来自瑞典、法国以及世界各地的朋友。 我寄宿的人家对我非常好。不过他们有一些奇怪的习惯。他们整天都在喝茶:早餐、中午、睡觉前。而且他们把盐放在奶油里吃!如果我晚上出去,我经常吃的是鱼和炸土豆条。食物是用报纸包着的;最后看报纸都忘了吃了! 在海滩上我们乘公共汽车旅行。有一天,我被一们女士推倒了,因为我没有排队;她用手袋敲我的头。在车上,英国人通常都很安静。如果我们在车上喧闹的话,他们会很苦恼,觉得不舒服。所以我很惊讶地发现他们在排队问题上会变的很暴力。 大多数英国人只讨论天气。接着他们就会讨论很多关于下雨、括风甚至有时候讨论雾。但是,如果你向他们问路的话,他们就会变的很热心,甚至可以花一个小时帮你。 我很希望来年再回来看望我所有的朋友。哦,当然,还有更好的学好英语。
2023-08-14 03:12:424

ROS PPPOE限速

假设PPPOEserver是可以通过组来限速和通过账号来限速的在PPP里Profiles里的Ratelimti可以限速也可以在secrets账号里限速两个方法都可以实现,区别是组里设置号以后,只要在这个组里的账号都采用这个策略,账号里限制更加灵活一点,如果账号比较多建议采用组,如果账号比较少建议采用用户模式
2023-08-14 03:13:292

rabbitmq如何用命令删除队列

学习rabbitmq可以参考IT论坛,比如https://www.itkc8.com/forum/programme/2/699/1.html
2023-08-14 03:13:392

【转】ksoftirqd进程耗尽单核100%si处理软中断导致性能瓶颈

最近测试LVS性能,发现当CPU其中一个核耗尽后系统达到性能顶峰。 消耗CPU资源的是ksoftirqd进程,全部用于处理软中断(从进程名也能识别出了)。 搜了一下,很多人都遇到这类问题,似乎也没有解决。了解到并尝试过的解决方案有: 1、减少集群成员的数量; 2、修改集群模式(NAT、TURNL、DR); 3、修改集群调度算法; 4、升级操作系统内核到2.6.20以上; 5、调整网卡的最大传输单元(MTU); 6、修改设备中断方式; 7、使用多网卡负载均衡; 8、升级硬件(网卡); 9、更换操作系统。 一一解说如下吧: 第1点 :减少集群成员的数量。由于瓶颈不在真实服务器上,所以减少成员数量,lvs性能没有明显变化。 第2点 :修改集群模式。理论上DR模式是最省资源的,大概了解理论的朋友应该都知道。由于NAT模式不满足需求,故仅对比了DR和TUN模式,两者没有明显区别。 第3点 :修改集群调度算法。已有的十种算法中属rr最简单,而且目前瓶颈还未深入到这一层。实际上在处理网络包的时候导致的瓶颈。调度算法简单比较了rr和wrr,两者没有明显区别。 第4点 : 升级操作系统内核到2.6.20以上 。我直接升级到当前已发布的最新版本2.6.34,结果瓶颈并没有得到改善。 第5点:调整网卡的最大传输单元。交换机支持最大的传输单元是9216,将网卡的最大传输单元分别修改为:1500(默认)、5000、9000、9216。其中1500和5000两者没有明显差别,9000和9216会导致网络不稳定,性能也没有提高反而出现大量连接超时。 第6点:修改设备中断方式。通过修改设置中断/proc/irq/${网卡中断号}/smp_affinity: 测试服务器CPU为四核,理论上网卡的smp_affinity值为1、2、4、8分别对应cpu0、cpu1、cpu2、cpu3。 结果: 1、网卡的smp_affinity默认值为8,测试过程中软中断全部由cpu3处理。正确 2、设置smp_affinity = 1,测试过程中软中断全部由cpu0处理。正确 3、设置smp_affinity = 2,测试过程中软中断全部由cpu1处理。正确 4、设置smp_affinity = 4,测试过程中软中断全部由cpu2处理。正确 5、设置smp_affinity = 5,测试过程中软中断全部由cpu0处理,预期应该分配给cpu0和cpu2处理。无效 6、设置smp_affinity = f,测试过程中软中断全部由cpu0处理,预期应该分配给cpu0、cpu1、cpu2和cpu2处理。无效 即:修改smp_affinity的功能只针对单核有效。 第7点:使用多网卡负载均衡。此方案可行!使用两张网卡绑定一个IP地址,性能就提升了一倍,效果非常明显。原因就是两张网卡各用一个CPU核,相比用单核而言,性能自然提升一倍。 配置方式如下: 第8点 ,升级硬件,使用支持RSS功能的网卡。** 下面是 intel 对RSS的说明 Receive-side scaling (RSS) routes incoming packets to specific queues, efficiently balancing network loads across CPU cores and increasing performance on multi-processor systems. RSS, called Scalable I/O in Linux*, creates a hash table from IP, TCP, and Port Addresses and uses that table to decide which queue to route a packet to, and to which processor the packet should be associated. 可是从我们使用网卡的官网硬件指标上,都是支持RSS的。Windows的设置方式是 **netsh int tcp set global rss=enabled** 。 第9点 ,更换操作系统。此方案在生产环境下部署的可能性比较小,但是否关操作系统的事确实需要确认。 据说Windows的NLB、solaris、AIX支持网卡RSS,目前还有待确认。
2023-08-14 03:14:331

有英文好的大哥在没……

意思是 限制播种率
2023-08-14 03:15:035

C语言 数据结构 7道选择 因为是双语 所以是英语 麻烦帮下忙 谢谢了

Answer:D A A C B C C......Ps:哪题有疑问可以追问我....
2023-08-14 03:15:171

linux怎么从mq里面读取报文信息

在Linux中,可以通过以下方式从消息队列MQ中读取报文信息:1. 使用自带的PN命令。如果使用的消息队列系统自带有消息查询命令,可以直接使用该命令查询消息队列中的报文。如RabbitMQ有rabbitmqctl list_queues等命令。2. 使用消息队列的API。大多数消息队列系统都提供了客户端API,可以通过编写程序使用 API 读取消息队列中的消息。例如:- RabbitMQ提供AMQP客户端API,可以使用Polyglot AMQP, librabbitmq等库调用API读取消息。- Kafka提供Kafka客户端API,可以使用kafka-python, librdkafka等库调用API读取主题中的消息。- ActiveMQ提供JMS API,可以使用JMS客户端如NMS读取消息。使用消息队列的API是主流的读取MQ报文的方式。需要选择消息队列对应的客户端API,编写读取消息的程序。3. 使用消息队列提供的管理工具。一些消息队列系统提供了图形化的管理控制台或工具,可以通过该工具查询和读取消息队列中的报文信息。如:- RabbitMQ提供了RabbitMQ Management插件,可以通过Web UI查询消息队列信息。- Kafka提供了Confluent Control Center等工具可以管理主题和消费消息。 - ActiveMQ提供了ActiveMQ Console可以管理消息和订阅者。使用管理工具可以更直观简便地读取MQ中的报文信息。4. 解析消息队列的数据存储。一些消息队列系统使用数据库等方式存储消息数据,通过解析其数据存储也可以读取报文信息。但这种方式较复杂,需要深入研究消息队列的内部实现,一般不推荐。所以,读取Linux下MQ的报文信息,推荐的方式主要是:1) 使用消息队列自带的命令行工具(如果有)2) 调用消息队列提供的API,编写程序读取消息3) 使用消息队列的管理控制台或图形化工具查询消息这几种方式可以比较方便和标准地读取MQ中的报文信息。选择具体的方式需要根据使用的消息队列系统来决定。
2023-08-14 03:15:241

(高手请进)用C# 如何获取打印机中的任务数

在MSDN找到的,不知道可以用不,没测试过,呵呵获取打印服务器承载的打印队列的集合。 命名空间: System.Printing 程序集: System.Printing(在 System.Printing.dll 中) 语法 Visual Basic(声明) Public Function GetPrintQueues As PrintQueueCollection Visual Basic(用法) Dim instance As PrintServer Dim returnValue As PrintQueueCollection returnValue = instance.GetPrintQueues() C# public PrintQueueCollection GetPrintQueues() Visual C++ public: PrintQueueCollection^ GetPrintQueues() J# public PrintQueueCollection GetPrintQueues() JScript public function GetPrintQueues() : PrintQueueCollection 返回值 类型:System.Printing..::.PrintQueueCollection 打印服务器上的打印队列的 PrintQueueCollection。 示例 下面的示例演示如何使用此方法列出 PrintServer 承载的打印队列。 C# 复制代码 // Create a PrintServer // "theServer" must be a print server to which the user has full print access. PrintServer myPrintServer = new PrintServer(@"\theServer"); // List the print server"s queues PrintQueueCollection myPrintQueues = myPrintServer.GetPrintQueues(); String printQueueNames = "My Print Queues: "; foreach (PrintQueue pq in myPrintQueues) { printQueueNames += " " + pq.Name + " "; } Console.WriteLine(printQueueNames); Console.WriteLine(" Press Return to continue."); Console.ReadLine(); 平台 Windows Vista .NET Framework 和 .NET Compact Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。 版本信息 .NET Framework 受以下版本支持:3.5、3.0 SP1、3.0。
2023-08-14 03:15:322

进程调度

当计算机中有多个process处于ready状态,将CPU分配给哪个进程呢?操作系统中做出这个决策的组件就是调度器,决策的算法叫调度算法,决策过程就是进程调度的过程。 进程调度一般发生在一下几种情况下: 在非抢占式调度中,进程开始执行以后,除非它主动放弃CPU或被block, 否则就能一直执行。 抢占式调度中,如果在进程执行过程中来了一个优先级更高的进程,CPU使用权就会被抢走,尤其在时间片调度中即使时间片没用完也可以被抢占。但抢占也不是随时可以发生的,如果设计不好可能会发生优先级逆转或者死锁问题。 在不同的场景下,为了实现不同的目标,评价调度算法的标准不尽相同。这里我们介绍一些常用的标准: Fairness : 给每个进程公平的CPU使用机会 Balance : 让系统的各个组件都能得到最大程度的利用率 Throughput 吞吐量 :单位时间内完成的任务数量 Turnaround Time :一般在批处理系统中,一个批任务从提交到结束的间隔时间 CPU Utilization :CPU的利用率 Waiting Time :进程在ready队列里等待的时间 Response Time :一般在交互式系统中,从用户提交任务到第一次得到响应(任务不一定完成)的间隔时间 Meeting Deadline :一般在实时系统中及时处理数据,避免丢失或失效 接下来我们看看在三种不同类型系统中常用的调度算法。 1. FCFS : First Come, First Served 这是一种非抢占式的先来先服务算法。ready process队列只有一个。如果进程执行中被block,进入block队列,ready之后作为新的进程排到ready队列的尾部。 优点:容易理解,容易实现 缺点:平均等待时间往往很长,不好平衡CPU密集和IO密集型进程 2. SJF: Shortest Job First SJF也是非抢占式调度,每次都选择最短的任务来执行。 3. Shortest Remaining Time Next 是SJF的抢占式版本,只要有新任务到达就重新调度选择剩余时间最短的任务执行。 SJF和Shortest Remaining Time Next的问题在于一般情况下很难判断进程的剩余执行时间是多少。除非这是经常要执行的task,根据对历史的统计分析能确定一个执行时间的大致范围。 1. Round-Robin Scheduling 轮询调度。 给每个进程相同的时间片,轮流执行。一般时间片选择在20-50msec比较合适,太短会导致进程切换浪费时间,太长会导致响应时间延长。 优点:比SJF响应快 缺点:turnaround时间长 2. Priority Scheduling 优先级调度为每个进程分配优先级,高优先级先执行,这也是时间片调度算法。优先级可以静态分配也可以动态分配,为了避免高优先级的进程一直占用CPU不放,可以在依次执行结束后降低其优先级。相同优先级的进程之间可以使用其他的调度算法如round-robin,不同队列可以使用不同的调度算法。 优点:引入了优先级 3. Multiple Queues 为了避免执行时间长的进程频繁进程切换,可以在不同的优先级队列之间分配不等长度的时间片。进程执行一次之后被分配其他拥有更长执行时间的优先级。比如一个进程需要100个quanta, 第一次执行时分配1个,下一次执行分配2个,再下次分配4,8,16,32,64. 比每次都只分配1的纯轮询算法减少了进程调度的次数。 4. Guaranteed Scheduling 前面提到的算法都不保证进程能够得到的CPU时间,但有些情况下我们需要确保进程使用CPU的机会和时间,比如n个用户同时登录,一般要保证每个用户都能获得1/n的CPU,或者我们购买VPN服务,根据不同的用户级别需要获得一定的带宽保证。这种算法就叫Guaranteed 调度。在实现中,需要追踪给每个进程分配的CPU,与承诺分配量比较,比值最小的进程会获得下一次使用权。 5. Lottery Scheduling 彩票调度算法引入了随机性,为每个进程发一张彩票,调度时就像开奖,谁中奖谁获得资源。优先级更高的进程可以获得多张彩票以提高中奖机会。 彩票调度有趣的地方在于进程之间可以互赠彩票,比如process 1 pending在process 2上,它可以把自己的彩票都给process2提高它被调度的机会。process2结束以后再把彩票还给process1. 6. Fair-Share Scheduling 下面考虑一种情况,所有进程并不属于一个用户,这在Linux 系统中非常常见。如果user1有99个process,user2只有1个process,按照前面的算法可能user1能得到99%的CPU,而user2只有1%。为了实现用户层面的公平性,调度时需要考虑进程属于哪个user. 实时系统分两种: 实时系统中,一般任务时间都比较短,调度器需要使所有进程都在deadline前完成。对于周期性发生的事件,如果事件发生的周期为 , 事件处理时间(需要占用CPU的时间)为 , 只有 时,才是可调度的。 调度算法只能由操作系统实现吗,关于使用哪种调度算法进程是否有话语权呢?答案是可以的。将机制与策略分离,由操作系统提供多种实现机制,并提供system call由process传参数给OS指定具体使用哪一种调度策略。 如果线程是在用户态实现的,那么需要两级调度,OS负责调度process,process负责调度thread。如果线程是在内核态实现的,OS直接调度thread,而不关心它属于哪个process。
2023-08-14 03:15:401

C++编程(关于操作系统的进程问题)

你的悬赏足够多么?呵呵玩笑
2023-08-14 03:15:482

谢谢帮忙翻译成汉语!急急急用!!!

吉娜却惊讶地发现这是没有下雨的London.She走下火车,带来了她从Dover到维多利亚车站和把她沉重的行李箱上platform.People到处是hurring ;通过出入口,向上和向下的步骤,以及其他平台和售票柜台,已经有队列形成。
2023-08-14 03:16:082

c#设置页面范围打印问题

MyPrintDocument_PrintPage 事件里面 e.HasMorePages = true; 判断是否打印多页的
2023-08-14 03:16:171

win7上安装tuxedo8.0以后,执行tmboot -y启动命令报错!

怎么解决的啊?
2023-08-14 03:16:302

把下面的话翻译成英文~~~~谢啦

The 60th anniversary of the founding of the changes in60 years, can be described as one stroke! 60 years of personal experience has taught me to touch the pulse of social progress, 60 years of reform and opening up every one to benefit people"s lives.In December 1978, the party"s victory in the Third Plenum was held open the new historical period of reform and opening up, this is our party since the founding of far-reaching significance in the history of a great turning point.The national economy in three decades, rapid development of our living and working conditions are also the three decades is undergoing tremendous change, basic necessities and living environment, working conditions, which are the same as earth-shaking.Listen to his mother, said the planned economy era during the credentials supplied by a year at most be able to purchase the two new clothes, or general plain cloth. "New Year wearing new clothes," the anticipation is that period of their peers who have had the desire it, in the absence of the New Year if we can put on new clothes, so that when the neighbors envious of the kind of satisfaction and pride so that today"s young people can not be understanding, not to say that the little angels who each have at least several sets of styles and textures are very good and the clothing of the four seasons.Food supply is her mother memorable tickets buy meat is natural, but definitely not pick the election fat thin in envy, not to speak rafts crowded open-air long queues, and to worry about their turn will come, when there are No goods can be bought. Because the queues to purchase food which caused people to noise and might even be pulling it to the kids terrified mother, a teenager fear most is to allow parents to cry forward to going to line up to accept this task, often fooling with that "would rather not eat meat is also do not line up. " The sixties and seventies material poverty-stricken and a brown sugar or fermented tofu, and even added a point of red pepper powder salt was once a shared snacks,The phase at the time to eat with relish in a little worse than the kids who do not eat new foods listed on the excitement level was numb after the carefree pepper is also no less now after the Earned dripping hot pot.Thirty years ago, many families have only one of the houses, almost the same layout is to use a bed or a large closet on the houses in the middle, up the curtain the house was divided into two, front living room and dining room, Mom said that they play only in bed, when seated, conditions can be better prepared for the 12 small Mazari or small wooden bench; children and more families have to design into the lower berth, while the back is a bed in another bedroom and storage room in a unified . At present, conditions are good, most people lived on the flat points Sanshiyiting, have their own independent kingdom, excitement, self-evident.Not to mention how the current conditions of office automation, advanced a single one did not know that drinking water for how many kinds of water heaters, while in the late 50s last century, water can only be served in the morning, the boiler room to lay in order to ensure full day needs. Now, sitting next to do the work, asking for is a plus pure water drinking fountains, hot and cold since the pour, good uncomfortable.There are communication tools changes, eighties was hand-cranked telephone, each time when you need to contact your headache, not to mention first post office connected to the operator, and then transferred to a place or a particular unit, if the the other is the signal is not very good, very marked with several phone calls a day and sometimes even have to be connected. The nineties, the pioneer of reform and opening up, waist across the BB machines, the paging call signal at any time, often issuing calls, but also deliberately pretending to hear, let it ring for several more ......, holders of more than The share of pride, self-evident. By the year of the millennium, cellular phones becameA status symbol, the holder should not only out of proportion with their height voice shouting, must also mixed with the local language at the same time, it felt significant in front of Santa. Into the twenty-first century, the hands of every individual has more than one mobile phone, wherever close proximity with each other, work efficiency and economic benefits of double harvest.
2023-08-14 03:16:414

2个C++程序的问题

很简单的问题,可以告诉你算法,如果要得到完整的程序,我只提供有偿服务。 :)
2023-08-14 03:16:513

怎样限制Linux用户的进程数?

这个可以通过修改 vi /etc/security/limits.conf 文件来设定:x0dx0a# vi /etc/security/limits.confx0dx0avpsee hard nproc 32x0dx0a@student hard nproc 32x0dx0a@faculty hard nproc 64x0dx0a上面的配置文件意思是说限制 vpsee 这个用户只能 fork 32 个进程;然后限制 student 这个用户组的每个成员最多能 x0dx0afork 32 个进程;限制 faculty 这个用户组的每个成员最多能 fork 64 个进程。不过要事先检查系统是否有 x0dx0apam_limits.so 这个模块以及是否已经加载:x0dx0a# ls /lib64/security/pam_limits.sox0dx0a/lib64/security/pam_limits.sox0dx0a# vi /etc/pam.d/loginx0dx0asession required pam_loginuid.sox0dx0a如果自己是 Linux 普通用户,不是 root 用户不能修改 limits.conf 和重启系统的话,可以用 ulimit x0dx0a来临时限制自己允许创建的进程数,ulimit 有 Hard 和 Soft 两种方法限制,用 Hard x0dx0a的话可以减少最大可用的进程数,但是就不能重新增大这个限制了;用 Soft 的话可以自己自由增大和减小限制(ulimit,-H 和 -S x0dx0a的详细说明可以参看 man ulimit)。不同的 Linux 版本对这个 ulimit -u 的默认值不同,在 CentOS x0dx0a上默认情况下最大运行进程数是 8256,在 Fedora 上是 x0dx0a1024,所以这个要看不同的发行版本,不过这个无所谓,反正可以改,不过改成32后就不能再改成比32更大的了(比如64),只能再改成比32小x0dx0a的,ulimit 不带 -H 和 -S 参数的时候同时设置 Hard 和 Soft:x0dx0a$ ulimit -ux0dx0a8256x0dx0a$ ulimit -u 32x0dx0a$ ulimit -u 64x0dx0a-bash: ulimit: max user processes: cannot modify limit: Operation not permittedx0dx0a$ ulimit -ax0dx0acore file size (blocks, -c) 0x0dx0adata seg size (kbytes, -d) unlimitedx0dx0ascheduling priority (-e) 0x0dx0afile size (blocks, -f) unlimitedx0dx0apending signals (-i) 8256x0dx0amax locked memory (kbytes, -l) 32x0dx0amax memory size (kbytes, -m) unlimitedx0dx0aopen files (-n) 1024x0dx0apipe size (512 bytes, -p) 8x0dx0aPOSIX message queues (bytes, -q) 819200x0dx0areal-time priority (-r) 0x0dx0astack size (kbytes, -s) 10240x0dx0acpu time (seconds, -t) unlimitedx0dx0amax user processes (-u) 32x0dx0avirtual memory (kbytes, -v) unlimitedx0dx0afile locks (-x) unlimited
2023-08-14 03:16:591

messages-dequeued是什么意思

messages-dequeued消息出列Messages are stored in queues, and MQ servers allow you to enqueue messagesonto queues, and dequeue messages from them. 消息存储在队列里,MQ 服务器允许您将消息加入到队列以及从队列中取走消息。At that point, the system changes from asynchronous behavior to synchronousbehavior, where the producer can enqueue messages only as fast as the consumercan dequeue them. 当队列满员时,系统从异步行为切换到同步行为,这时,消息生成者生成消息的速度只能与消息使用者使用消息的速度一样快。
2023-08-14 03:17:081

c语言循环队列的错误修改

1. 调用 queuetraverse_sqqueuetraverse_sq(q, int(*e));-->> queuetraverse_sq(q, (*visit)); 2. 定义queuetraverse_sqint queuetraverse_sq(sqqueue q, int(*visit)()) -->> int queuetraverse_sq(sqqueue q, int(*visit)(char*))3. 定义visitint visit(char (q.base)) { printf("%c", *(q.base)); return ok; } -->>int visit(char* base) { printf("%c", *base); return ok; }
2023-08-14 03:17:303