-1

我不是操作系统/系统程序员(但它一直吸引着我很多:)),所以我不确定这是否是一个好问题,而且可能不够清楚(实际上它不止一个问题)。

是否有可能/可行/实用地调整 Linux 内核(和其他系统程序)(通过配置或任何重写)以获得最佳性能,以便他们可以最大限度地利用硬件(如果不是 100%)?

我的问题并非特定于操作系统,但我认为操作系统优化可以提供巨大帮助。

我可以考虑控制线程数量并将负载平均分配给它们可以帮助实现这一目标。在使用大量多核(1/2/4/6/8)处理器的情况下,我认为软件应该(以某种方式(?))实现内核数量(在安装时或在调用时)并分配负载均匀分布在其中。如果没有充分利用硬件的软件,我认为这些硬件的力量是浪费的。

还有其他我可以想到的方法,例如我有一台四核机器,5400rpm sata HDD 是瓶颈,所以如果软件可以实现这一点并通过增加缓存和使用异步/延迟读取来最小化磁盘读取/写入/writes 它将有助于提高性能。

我还想知道,通过 OpenCL 和 CUDA 库,智能地使用 GPU 中的处理单元是否有很大帮助?

我没有写过(甚至读过)任何严肃的程序(除了我的工作,它是与网络相关的,客户端-服务器类型的),但我肯定会尝试一下。我的想法/假设和我的要求是否有意义?还是我要疯了?

4

2 回答 2

1

一个进程花费的大部分时间都会被I/O. 例子是:

  1. 将一大块数据从/向辅助存储读取/写入 RAM(在执行时freadfwrite例如)
  2. 等待数据包通过网络到达。

如您所见,在这些操作完成之前,该过程被阻止。如果应用程序进程中有逻辑在它等待时做一些有用的事情,是的,内核会很乐意为这些线程提供服务。如果不是,内核将把进程放到sleep它为属于其他进程的线程提供服务时ready

计算密集型应用程序是不同的。他们倾向于在数据集(例如矩阵)上运行大量迭代来计算某些东西。编译器尝试自己的优化,例如vectorization减少现代处理器上的一些 CPU 周期。使用诸如 openMP 之类的库可以帮助您指示代码的并行部分,并指定在执行该代码段时要产生多少线程。同样,所有这些都是在用户空间中完成的同一应用程序的优化。

内核主要负责调度任务。有不同的调度程序算法,如果您查看任何发行版内核,它们会提供很少的变体。该-desktop变体是您通常会看到使用的变体,因为调度程序针对大多数桌面应用程序使用进行了优化。还有其他变体,如-realtime`-xen 等,同样适用于特定应用程序。您可以查看调度程序在所有这些情况下的行为有何不同。

于 2013-03-01T17:29:16.733 回答
1

对于更改磁盘 I/O 以进行缓存,这部分已经在现代操作系统中发生。例如,只要有足够的空间,Linux 就会将您访问的所有文件的内容缓存在 RAM 中(即使在某些情况下,如果可用 RAM 变少,更喜欢将这些文件保留在 RAM 中而不是实际的应用程序数据)。

但是,应用程序的概念是希望数据在写入磁盘后是安全和持久的(至少在他们保证之后,例如通过调用fsync)。操作系统必须确保它确实如此,因此它必须等待驱动器实际写入数据。如果应用程序不要求这样做,例如 Linux 将假装它已将数据写入磁盘,但实际上仅将其保留在内存中,同时以磁盘允许的速度将其写入磁盘。与此同时,应用程序可以继续执行它之前所做的任何事情。

您建议的许多事情已经在操作系统中发生,只是有时您真的不能使用 100% 的硬件,因为这会违反预期或保证(例如上面的磁盘 I/O),或者没有足够的工作要做. 如果您启动一个执行大量并行计算的应用程序(例如,使用 OpenCL),它肯定会加载它可以获得的所有 CPU,直到工作完成。

此外,有时您无法将 CPU 加载到 100%,因为它必须等待其他设备,如硬盘、内存、网络等。如果没有足够的内存来保存数据,最好的文件缓存将无济于事:您必须将数据交换到硬盘驱动器,这很慢,浪费 CPU 周期。

但是请注意,当应用程序在磁盘和其他设备上等待输入或输出时,其他应用程序通常可以运行。操作系统通常会尝试尽可能多地利用硬件。

于 2013-03-01T17:14:28.820 回答