如何使用 GZip 多线程归档器将 CPU 负载优化到 100%?
How to optimize CPU load up to 100% with GZip multithread archiver?
我已经在一个多线程文件归档器上工作了一个星期,它只在干净的线程上工作。同步是通过监视器和 AutoResetEvent 实现的。
我将线程数分配给了这样的内核数:
public static int GetCoreCount()
{
int coreCount = 0;
foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get())
{
coreCount += int.Parse(item["NumberOfCores"].ToString());
}
return coreCount;
}
但是我的 CPU 最大负载约为 65%。
而且这个负载远非均匀,它不断下降和上升。
告诉我。有谁知道如何使用 100% 处理器能力?
这是我的 运行() 代码:
public void Run()
{
var readingThread = new Thread(new ThreadStart(ReadInFile));
var compressingThreads = new List<Thread>();
for (var i = 0; i < CoreManager.GetCoreCount(); i++)
{
var j = i;
ProcessEvents[j] = new AutoResetEvent(false);
compressingThreads.Add(new Thread(() => Process(j)));
}
var writingThread = new Thread(new ThreadStart(WriteOutFile));
readingThread.Start();
foreach (var compressThread in compressingThreads)
{
compressThread.Start();
}
writingThread.Start();
WaitHandle.WaitAll(ProcessEvents);
OutputDictionary.SetCompleted();
writingThread.Join();
如果不进行分析,就不可能知道是什么限制了您的核心使用,也无法知道您在测试中压缩了多少数据。
但是我可以说,为了获得良好的效率,这包括完整的核心利用率和接近 n 因素的加速 n 个线程超过一个线程,在 pigz 中,我必须创建始终存在的线程池,运行 或等待更多工作。为每个要处理的数据块创建和销毁线程是一个巨大的影响。出于同样的原因,我也有预先分配的内存块池。
link 中的 C 源代码可能会有帮助。
我已经在一个多线程文件归档器上工作了一个星期,它只在干净的线程上工作。同步是通过监视器和 AutoResetEvent 实现的。 我将线程数分配给了这样的内核数:
public static int GetCoreCount()
{
int coreCount = 0;
foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get())
{
coreCount += int.Parse(item["NumberOfCores"].ToString());
}
return coreCount;
}
但是我的 CPU 最大负载约为 65%。 而且这个负载远非均匀,它不断下降和上升。 告诉我。有谁知道如何使用 100% 处理器能力? 这是我的 运行() 代码:
public void Run()
{
var readingThread = new Thread(new ThreadStart(ReadInFile));
var compressingThreads = new List<Thread>();
for (var i = 0; i < CoreManager.GetCoreCount(); i++)
{
var j = i;
ProcessEvents[j] = new AutoResetEvent(false);
compressingThreads.Add(new Thread(() => Process(j)));
}
var writingThread = new Thread(new ThreadStart(WriteOutFile));
readingThread.Start();
foreach (var compressThread in compressingThreads)
{
compressThread.Start();
}
writingThread.Start();
WaitHandle.WaitAll(ProcessEvents);
OutputDictionary.SetCompleted();
writingThread.Join();
如果不进行分析,就不可能知道是什么限制了您的核心使用,也无法知道您在测试中压缩了多少数据。
但是我可以说,为了获得良好的效率,这包括完整的核心利用率和接近 n 因素的加速 n 个线程超过一个线程,在 pigz 中,我必须创建始终存在的线程池,运行 或等待更多工作。为每个要处理的数据块创建和销毁线程是一个巨大的影响。出于同样的原因,我也有预先分配的内存块池。
link 中的 C 源代码可能会有帮助。