我有一个网络客户端和服务器应用程序。 数据流使得客户端向服务器发送消息,并且服务器以确认响应。 仅在收到确认后,客户端才会秒发下一条消息。

用C ++编写的客户端应用程序具有3个线程,即网络线程(负责通过套接字发送消息),主线程(负责发出请求消息)和计时器线程(每秒触发)。

服务器应用程序具有2个线程,主线程和网络线程。

我运行RHEL 6.3、2.6.32-279内核。

配置1

  1. 调整的adm配置文件延迟性能
  2. 所有客户端线程在同一CPU核心ID上
  3. 所有服务器的线程都在相同的CPU核心ID上,但与客户线程的核心ID不同
  4. 客户端和服务器在同一台计算机上运行

吞吐量:每秒4500条消息

配置2

  1. tuned-adm配置文件吞吐性能
  2. 所有客户端线程在同一CPU核心ID上
  3. 所有服务器的线程都在相同的CPU核心ID上,但与客户线程的核心ID不同
  4. 客户端和服务器在同一台计算机上运行

吞吐量:每秒9-15条消息

配置3

  1. tuned-adm配置文件吞吐性能
  2. 不同CPU核心ID上的所有客户端线程
  3. 所有服务器线程在不同的CPU核心ID上以及客户端的线程在不同的核心ID上
  4. 客户端和服务器在同一台计算机上运行

吞吐量:每秒1100条消息

机器的负载可以忽略不计。 当配置文件从延迟性能更改为吞吐量性能时,有人可以解释一下每秒4k到9条消息的下降。

===============>>#1 票数:1

这是RHEL tuned-adm配置文件之间差异的基本时间表:

延迟性能将I / O升降机移至截止日期,并将CPU调速器更改为“性能”设置。

吞吐量性能针对网络和磁盘性能进行了优化。 请参阅下面的详细信息...

您的工作负载似乎对延迟敏感。

在此处输入图片说明

这是带有注释的throughput-performance的设置。 latency-performance不会修改任何这些。

# ktune sysctl settings for rhel6 servers, maximizing i/o throughput
#
# Minimal preemption granularity for CPU-bound tasks:
# (default: 1 msec#  (1 + ilog(ncpus)), units: nanoseconds)
kernel.sched_min_granularity_ns = 10000000

# SCHED_OTHER wake-up granularity.
# (default: 1 msec#  (1 + ilog(ncpus)), units: nanoseconds)
#
# This option delays the preemption effects of decoupled workloads
# and reduces their over-scheduling. Synchronous workloads will still
# have immediate wakeup/sleep latencies.
kernel.sched_wakeup_granularity_ns = 15000000

# If a workload mostly uses anonymous memory and it hits this limit, the entire
# working set is buffered for I/O, and any more write buffering would require
# swapping, so it's time to throttle writes until I/O can catch up.  Workloads
# that mostly use file mappings may be able to use even higher values.
#
vm.dirty_ratio = 40

  ask by Jimm translate from so

未解决问题?本站智能推荐:

2回复

在C ++中生成从-K到K的随机数(大小为M)的向量

有没有一种快速的方法来做到这一点?
2回复

释放内存后,进程的RES内存会下降吗?

我有一个连续分配内存的进程,它将在另一个线程处理了相关数据之后将其释放。 当数据处理速度很慢时,我看到RES内存增长了; 但在处理完所有数据后,RES会下降,但不会返回到原始RES值(即使等待了10分钟以上)。 例如10 MB(原始)=> 50 MB(峰值)=> 30MB(
1回复

为什么以及何时应该使用IPC_NEW来创建信号量?

我们可以通过两种方式来创建信号量。 1。 和 2。 正如Linux手册http://man7.org/linux/man-pages/man2/shmget.2.html中提到的那样 IPC_PRIVATE不是标志字段,而是key_t类型。 如果将此特殊值用于密钥
1回复

给定种子和偏移量,生成下一个伪随机值

对于给定的rand实现,是否有可能在给定初始种子和到目前为止对rand的调用次数的情况下,有效地生成序列中的下一个数字? 我想要使​​用rand为模拟中的节点提供时间偏移。 每个节点将使用其唯一的ID作为种子,并使用rand的输出来提供仿真延迟中的抖动。 我希望每个节点都能为其他任何节
1回复

GHashTable的大小/调整大小

这是我的用例:我想使用glib的GHashTable并将IP地址用作键,并将此IP地址发送/接收的数据的总和作为值。 例如,我成功地使用一些内核变量在用户空间中实现了整个问题,以便查看每个IP地址的容量。 现在的问题是:假设我有很多IP地址(即,500,000个最多1,000,000个唯
1回复

当字节以偏移量0写入文件时,能否保持写入时间稳定?

linux内核:5.1.15 glibc:2.29 g ++:9.1.1 std:c ++ 17 -Ofast ext4fs HDD:Seagate ST1000LM014 1TB SSHD 2.5“ 我从状态将nbrmsgs int写入打开的文件中,如下所示: 致电:
3回复

在Ncurses上添加滚动条或使其像“更多”

基本上我正在编写一个客户端程序,它从服务器接收响应和日志,客户端也能够向服务器发送请求以获取不同的信息。 我用curses和输出看起来很不错。 看起来像VI,输出在顶部,用户在客户端输入命令在底部。 唯一的问题是我无法向后滚动..我的老板告诉我要把它变成“linux中的更多命令”,我想坚持
11回复

自旋锁与信号量

信号量和自旋锁之间的基本区别是什么? 什么时候在自旋锁上使用信号灯?
2回复

如何在addr2line运行时的偏移量中解析backtrace_symbols()中的cpp符号

为了在运行时捕获像分段错误这样的致命错误,我编写了一个自定义SignalHandler,它将堆栈跟踪打印到控制台并进入日志文件。 为了实现这一点,我使用backtrace()和backtrace_symbols()函数backtrace()与我之前的数百个backtrace_symbols
1回复

快速调整mmap文件的大小

我需要一个非常大的mmap文件的无副本重新大小,同时仍然允许并发访问读取器线程。 简单的方法是在同一个文件中使用两个MAP_SHARED映射(增长文件,然后创建包含增长区域的第二个映射),然后在所有可以访问它的读者完成后取消映射旧映射。 但是,我很好奇下面的方案是否有效,如果有的话,它是