我不确定 serverfault 是否适合问这个问题,但我想知道如果您必须为 Java Web 应用程序选择新的 CPU 类型,您会做出什么选择:
a) 具有 32 个内核和时钟速度 2.5 Ghz 的 CPU
或者
b) 具有 8 个内核但时钟速度为 3.8 Ghz 的 CPU
鉴于 Web 应用程序的每个传入 HTTP 请求都由一个免费的 Java 线程提供服务,选择 a) 可能是有意义的,因为您可以同时处理四倍多的 HTTP 请求。然而,另一方面,CPU b) 可以更快地完成单个 HTTP 请求的处理......
你怎么认为?
旁注:
作为序言,我在 AMD64 芯片组上使用带有内核 3.2 的 Debian Wheezy。我的机器有两个至强 E5-2690 内核。我设置了启动参数,以便一个 CPU 上的所有内核专用于单个进程。为此,我在 grub 中设置了 isolcpus=8,9,10,11,12,13,14,15。
到现在为止还挺好。现在假设我想对给定命令使用隔离的 CPU,简单地说,我将使用一个简单的无限循环:
$ taskset -c 8-15 bash -c 'while true ; 做回声你好>/dev/null; 完毕' &
到目前为止一切顺利,top 表明核心 8 的利用率接近 100%。现在假设我再次启动该命令:
$ taskset -c 8-15 bash -c 'while true ; 做回声你好>/dev/null; 完毕' &
现在 top 显示内核 9-15 保持空闲并且两个进程共享内核 8。如果相反,我这样做:
$ taskset -c 8 bash -c 'while true ; 做回声你好>/dev/null; 完毕' &
$ taskset -c 9 bash -c 'while true ; 做回声你好>/dev/null; 完毕' &
核心 8 和 9 各获得 …
我们有一个使用 IIS 中托管的 ServiceStack 实现的 API。在对 API 执行负载测试时,我们发现响应时间很好,但是一旦我们达到每台服务器大约 3,500 个并发用户,它们就会迅速恶化。我们有两台服务器,当有 7,000 名用户访问它们时,所有端点的平均响应时间都低于 500 毫秒。这些盒子在负载平衡器后面,所以我们每台服务器有 3,500 个并发。然而,一旦我们增加了总并发用户数,我们就会看到响应时间显着增加。将每台服务器的并发用户数增加到 5,000,我们每个端点的平均响应时间约为 7 秒。
服务器上的内存和 CPU 都非常低,而响应时间很好,而且响应时间很短。在 10,000 个并发用户的峰值时,CPU 平均略低于 50%,RAM 位于 3-4 GB 左右(共 16 个)。这让我们认为我们在某处达到了某种限制。下面的屏幕截图显示了在总共 10,000 个并发用户的负载测试期间 perfmon 中的一些关键计数器。突出显示的计数器是请求数/秒。在屏幕截图的右侧,您可以看到每秒请求数图表变得非常不稳定。这是响应时间缓慢的主要指标。一旦我们看到这种模式,我们就会注意到负载测试中的响应时间很慢。
我们如何解决这个性能问题?我们正在尝试确定这是编码问题还是配置问题。web.config 或 IIS 中是否有任何设置可以解释这种行为?应用程序池运行 .NET v4.0,IIS 版本为 7.5。我们对默认设置所做的唯一更改是将应用程序池队列长度值从 1,000 更新为 5,000。我们还在 Aspnet.config 文件中添加了以下配置设置:
<system.web>
<applicationPool
maxConcurrentRequestsPerCPU="5000"
maxConcurrentThreadsPerCPU="0"
requestQueueLimit="5000" />
</system.web>
Run Code Online (Sandbox Code Playgroud)
更多细节:
API 的目的是组合来自各种外部来源的数据并以 JSON 形式返回。它目前正在使用 InMemory 缓存实现来缓存数据层的各个外部调用。对资源的第一个请求将获取所需的所有数据,对同一资源的任何后续请求都将从缓存中获取结果。我们有一个“缓存运行器”,它作为一个后台进程来实现,它以特定的时间间隔更新缓存中的信息。我们在从外部资源获取数据的代码周围添加了锁定。我们还实现了以异步方式从外部源获取数据的服务,因此端点应该只与最慢的外部调用一样慢(当然,除非我们在缓存中有数据)。这是使用 System.Threading.Tasks.Task 类完成的。我们是否会遇到进程可用线程数的限制?
我经常发现自己镜像了很多服务器文件,这些服务器文件中包含数千个1kb-3kb 的小文件。所有服务器都连接到 1Gbps 端口,通常分布在各种数据中心。
SCP 一个一个地传输这些小文件,这需要很长时间,我觉得我在浪费我拥有的美丽网络资源。
我有一个想法;创建一个脚本,将文件分成相等的数量,并启动 5-6 个 scp 线程,理论上会快 5-6 倍,不是吗?但我没有任何 linux 脚本经验!
假设我有一个四核盒子和四个相同的进程,每个进程有十个线程。在 Linux 中,是否可以说进程 A 只允许在 CPU 0 上运行,进程 B 只允许在 CPU 1 上运行,等等?
当我renice
在 Ubuntu 10.04 中执行多线程进程,然后在top
. 所有其他线程保留其旧的 nice 值。renice 进程中的所有线程而不仅仅是主线程的最简单方法是什么?
这是机器规格:
CPU(s): 20
Thread(s) per core: 1
Core(s) per socket: 10
Socket(s): 2
Run Code Online (Sandbox Code Playgroud)
根据我到目前为止所读到的内容,这些数字意味着我可以运行 20 个并行作业,因为我有 20 个 CPU。
但是,每个 CPU 中可以运行多少个线程?
linux central-processing-unit multi-threading concurrency parallel-computing
我有启用超线程的四核 CPU。所以我有 8 个逻辑核心。我想将我的应用程序限制为仅使用 4 个内核,并且我希望这 4 个内核是不同的物理内核。我应该使用哪些任务集选项(核心编号)?:
谢谢你。
linux unix central-processing-unit multi-threading hyperthreading
我系统上的 cat /proc/cpuinfo 为我的 2 个内核提供了不同的标志。有人可以向我解释为什么吗?我正在运行 Ubuntu 10.10 内核 2.6.35-24-generic。
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Intel(R) Core(TM)2 CPU E8400 @ 3.00GHz
stepping : 10
cpu MHz : 2999.820
cache size : 6144 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags …
Run Code Online (Sandbox Code Playgroud) 许多下载管理器(例如this、this和this)支持通过多个并行连接(每个线程一个)下载文件。其概念是每个连接将单独下载文件的一部分。
例如,如果有 5 个连接,则第一个连接将下载文件的前 0-20% 部分,第二个连接将下载文件的 20-40% 部分,依此类推。
同样,在服务器端,将有 5 个线程,其中一个线程将并行读取文件的 20%。
但是,我认为尝试使用多个线程同时读取单个文件实际上会使下载速度明显变慢,因为机械磁盘的读取磁头将不得不比以前进行更多的搜索。
即使我们假设磁盘控制器排队机制足够智能,可以在一次顺序读取中将所有 5 个多部分请求一起批处理到单个文件,但与仅在一个线程中执行读取然后为该文件提供服务相比,它并没有给我们带来任何优势。仅通过 1 个 http 连接即可文件。
那么如何才能更快地并行下载文件呢?
networking performance hard-drive web-server multi-threading
multi-threading ×10
linux ×6
performance ×2
scheduler ×2
unix ×2
affinity ×1
centos ×1
concurrency ×1
cpu-usage ×1
hard-drive ×1
iis ×1
java ×1
kernel ×1
networking ×1
nice ×1
scp ×1
web-server ×1