2

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

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

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

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

配置1

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

吞吐量:每秒 4500 条消息

配置2

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

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

配置3

  1. 调整的 adm 配置文件吞吐量性能
  2. 不同 CPU Core id 上的所有客户端线程
  3. 不同 CPU Core id 上的所有 Server 线程,以及来自 Client 线程的不同 Core Id
  4. 客户端和服务器在同一台机器上运行

吞吐量:每秒 1100 条消息

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

4

1 回答 1

1

以下是 RHEL tune-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
于 2013-06-01T15:15:18.663 回答