当前位置:首页 > 内存 > 正文

线程池占用内存太大

  • 内存
  • 2024-07-31 06:44:16
  • 386

一、C#管理大量耗时的线程,内存占用严重你的说法“线程池不适合耗时的任务”是最大的误解
1)你一定在类中见过很多BeginXXX/EndXXX方法,例如eceiveFrom和eiveFrom,这些函数统称为异步函数。异步函数操作的基础恰恰就是线程池。对于Socket通信,微软提供的异步操作是利用线程池中的I/O线程来提高SocketI/O性能并简化内存管理!
2)如果你对异步操作感到头晕,可以在处理Socket操作时使用“显式线程”方法,即按如下方式启动处理线程:
t=(你的处理函数);
ground=true;//这个设置特别重要!!!!!
();
一定要将线程设置为后台线程!
3)要知道,系统每次启动一个线程和销毁一个线程,都会造成很大的开销。当你的程序频繁启动和销毁线程时,必然会导致程序挂起。正是出于这个原因,微软创建了“线程池”。因为线程中的线程都是“启动”的(这句话说得不准确,但也没有错),一旦你把异步处理函数“挂钩”到线程池中的空闲线程上,就可以执行你想要的操作了。另外,额外的好处是完全不需要管理线程池中的线程(真正的“零”管理)
4)处理“耗时操作”,尤其是涉及耗时操作的操作就像例如像SocketI/O,最好的处理方式就是使用后台线程(必要时结合自定义事件),这是增加用户体验的唯一方法~~
二、如何设定线程池的大小只要您遵循一些简单的准则,线程池就可以是构建服务器应用程序的极其有效的方法:不要对同步等待其他任务结果的任务进行排队。这可能导致上述形式的死锁,其中所有线程都忙于处理任务,而这些任务又等待排队任务的结果,而这些任务由于所有线程都非常繁忙而无法执行。
在使用池线程进行可能较长的操作时要小心。如果程序必须等待I/O等资源完成,请指定最长等待时间以及是否随后使任务无效或重新排队以供以后执行。这确保了通过释放可以成功完成的任务的线程最终会取得一些进展。
了解任务
为了有效调整线程池的大小,您需要了解正在排队的任务以及它们正在做什么。它们受CPU限制吗?它们与I/O相关吗?您的回答将影响您如何调整问题。如果您拥有具有截然不同特征的不同资产类别,则为不同资产类别设置多个工作队列可能是有意义的,以便可以相应地优化每个池。
调整线程池的大小
调整线程池的大小基本上有助于避免两种类型的错误:线程太少或线程太多。幸运的是,对于大多数应用来说,太多和太少之间的差距相当大。
记住:在应用程序中使用线程有两个主要优点,即允许处理在等待I/O等缓慢操作的情况下继续进行,并利用多个处理器。在具有N个处理器的机器的计算约束下运行的应用程序中,当线程数接近N时添加额外的线程可以提高总处理能力,而当线程数超过N时添加额外的线程将没有效果。事实上,太多的线程甚至会降低性能,因为它们会导致额外的上下文切换开销。
线程池的最佳大小取决于可用处理器的数量和工作队列中任务的性质。如果具有N个处理器的系统上只有一个工作队列,且全部都是计算任务,那么当线程池有N或N+1个线程时,通常会达到最大CPU利用率。
对于可能需要等待I/O完成的任务(例如,从套接字读取HTTP请求的任务),您应该使池大小超过可用处理器的数量,因为并非所有线程都可用每时每刻。使用分析,您可以估计典型请求的等待时间(WT)与服务时间(ST)的比率。如果我们将此比率称为WT/ST,那么对于具有N个处理器的系统,您需要设置大约N*(1+WT/ST)个线程才能保持处理器得到充分利用。
处理器利用率并不是线程池大小调整过程中唯一考虑的因素。随着线程池的增长,您可能会遇到调度程序、可用内存或其他系统资源(例如套接字数量、打开文件句柄或数据库连接)的限制。


三、写给大忙人看的如何优雅设置线程池的大小

线程池应设置为适当的大小。如果太大,线程会过于频繁地上线,导致大量的资源开销,从而降低性能。如果太小,就会有大量的CPU资源可用但没有运行,造成资源浪费和吞吐量损失。

为了充分利用CPU资源,创建的线程数至少要等于CPU核心数。如果所有任务都是计算密集型的,那么线程数等于可用CPU核心数是合适的。但如果所有任务都是I/O密集型,那么CPU大部分时间都会处于空闲状态,因此应适当增加线程数。线程等待时间比例越高,需要的线程就越多。线程运行时间所占的比例越高,需要的线程就越少。所以可以用下面的公式来估算:

例如:每个线程计算的平均执行时间为0.5s以及线程的等待时间(非计算时间,如IO)是1.5秒。,目标CPU利用率为90%,CPU核心数为8,则根据上述公式估算:(1+1.5/0.5)*90%*8=28.8。

即使用上面的简单估算方法,看起来似乎合理,但实际上可能并不合理。应结合系统实际情况(如I/O或CPU使用率较高)。密集或纯内存操作)和硬件环境(CPU、内存、硬盘读写速度、网络状况等)不断尝试获得合理且现实的估计。您也可以尝试DarkMagic的估算方法。