`
jjw
  • 浏览: 65481 次
文章分类
社区版块
存档分类
最新评论

最佳线程数总结(1)

阅读更多

最佳线程数:

性能压测的情况下,起初随着用户数的增加,QPS会上升,当到了一定的阀值之后,用户数量增加QPS并不会增加,或者增加不明显,同时请求的响应时间却大幅增加。这个阀值我们认为是最佳线程数。

 

为什么要找最佳线程数

1.过多的线程只会造成,更多的内存开销,更多的CPU开销,但是对提升QPS确毫无帮助

2.找到最佳线程数后通过简单的设置,可以让web系统更加稳定,得到最高,最稳定的QPS输出

 

最佳线程数的获取:

1、通过用户慢慢递增来进行性能压测,观察QPS,响应时间

2、根据公式计算:服务器端最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间) * cpu数量

3、单用户压测,查看CPU的消耗,然后直接乘以百分比,再进行压测,一般这个值的附近应该就是最佳线程数量。

 

影响最佳线程数的主要因素:

1IO

2CPU

根据公式:服务器端最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间) * cpu数量

一般来说是IOCPUIO开销较多的应用其CPU线程等待时间会比较长,所以线程数量可以开的多一些,相反则线程数量要少一些,其实有两种极端,纯IO的应用,比如proxy,则线程数量可以开到非常大(实在太大了则需要考虑线程切换的开销),这种应用基本上后端(比如这个proxy是代理搜索的)的QPS能有多少,proxy就有多少。

另一种是耗CPU的计算,这种情况一般来讲只能开到CPU个数的线程数量。但是并不是说这种应用的QPS就不高,往往这种应用的QPS可以很高。

 

QPS和线程数的关系

1、在最佳线程数量之前,QPS和线程是互相递增的关系,线程数量到了最佳线程之后,QPS持平,不在上升,甚至略有下降,同时相应时间持续上升。

2、同一个系统而言,支持的线程数越多(最佳线程数越多而不是配置的线程数越多),QPS越高

 

QPS和响应时间的关系

1、对于一般的web系统,响应时间一般有CPU执行时间+IO等待时间组成

2CPU的执行时间减少,对QPS有实质的提升,IO时间的减少,对QPS提升不明显。如果要想明显提升QPS,优化系统的时候要着重优化CPU消耗大户。

 

最佳线程数和jvm堆内存得关系:

以上都是依据性能瓶颈在CPU的情况,对于java应用还有一个因素是FULL GC,我们要保证在最佳线程数量下,不会发生频繁FULL GC

根据公式::(GC时间间隔/rt)*(并发线程数量 * thm) <=young 计算得到的并发线程数量如果<最佳线程数量 则可能导致FULL GC较频繁,实际情况看来这种情况在web系统上非常少。不过可以模拟出来。

所以我们在设置jboss线程的时候,可以利用内存公式计算出来的线程数量来设置,通过压测和计算得到最佳线程数,然后设置线程数。

 

设置线程数量:

压测最佳线程数<真实设置的线程数量<内存极限线程数

比如,通过压测得到某系统的最佳线程数量是10,然后通过内存计算的线程数量是20,则,设置jboss的线程数量为15是可行的,如果直接设置了10,由于系统本身会受到一些依赖系统的变化而产生一些变化,比如系统依赖一些IO的响应时间会突然延长,由于线程数量还是10,其实这个时候最佳线程数量已经变成了13了,由于我们设置死了10,其结果就是导致qps下降,但是如果超过20,则又会引起FULL gc非常频繁,反过来影响QPS的下降。

 

jboss的线程数设置:

对于jboss而言,设置线程数量要看使用了那种线程连接,如httpajp

httpajp的设置是完全一样的,非常简单:

ajp为例,找到server.xml或者tomcat-server.xml:

默认线程数量是200

 <Connector port="8009" address="${jboss.bind.address}" connectionTimeout="15000" protocol="AJP/1.3" maxThreads="200" minSpareThreads="40" maxSpareThreads="75" maxPostSize="512000" acceptCount="300" bufferSize="16384" emptySessionPath="false" enableLookups="false" redirectPort="8443" useBodyEncodingForURI="true"/>

这里将默认的线程数量改成了20,当然相应的其他最小空闲线程数和最大空闲线程数也做一下调整:

<Connector port="8009" address="${jboss.bind.address}" connectionTimeout="15000" protocol="AJP/1.3" maxThreads="20" minSpareThreads="20" maxSpareThreads="20" maxPostSize="512000" acceptCount="300" bufferSize="16384" emptySessionPath="false" enableLookups="false" redirectPort="8443" useBodyEncodingForURI="true"/>

分享到:
评论
1 楼 qiuriyuchen 2012-11-02  
很不错的总结,很有用

相关推荐

    java线程安全总结.doc

    以下是对Java线程安全的深入总结: ### 一、线程安全的定义 线程安全是指当多个线程访问同一块代码时,如果每个线程都能得到预期的结果,且不产生数据不一致或同步问题,那么这块代码就被称为线程安全的。Java中的...

    Jmeter插件:响应时间TPS线程数

    当我们在调整线程数(即并发用户数)时,可以通过观察TPS的变化来确定最佳的并发水平。一般来说,增加线程数会提高TPS,但过高的线程数可能导致服务器资源耗尽,反而降低TPS,因此找到这个平衡点至关重要。 在进行...

    C# 线程使用总结

    1. **线程创建** 在C#中,可以通过两种主要方式创建线程:使用`Thread`类或使用`Task`类。`Thread`类是最原始的方法,直接实例化`Thread`对象并调用`Start()`方法启动新线程。而`Task`类是.NET Framework 4.0引入的...

    线程总结笔记

    ### 线程总结笔记——基于Linux环境下的线程控制与同步 #### 一、引言 本篇“线程总结笔记”主要针对Linux环境下多线程编程中的关键概念进行了整理与归纳,尤其是针对线程同步的问题进行了深入探讨。通过一个具体...

    java多线程编程总结

    ### Java多线程编程总结 #### 一、Java多线程概述 Java多线程是Java编程语言中不可或缺的一部分,它允许程序同时处理多个任务,从而显著提高应用程序的性能和响应速度。Java5之前的版本虽然支持多线程,但在语言...

    Java多线程编程总结

    ### Java多线程编程知识点详解 ...掌握线程生命周期、同步机制、并发工具和最佳实践是成为一名优秀Java开发者的关键。通过深入理解并熟练运用Java多线程技术,开发者能够设计出既高效又稳定的多线程应用程序。

    C#多线程开发技术总结

    以下是对C#多线程开发技术的详细总结: 一、线程基础知识 1. 线程的概念:线程是操作系统分配处理器时间的基本单元,一个进程可以包含一个或多个线程。 2. 线程状态:新建(New)、可运行(Runnable)、运行...

    C#内存释放-线程控制-线程启动-线程暂停

    总结一下,本主题涵盖了C#中的线程控制技术,包括线程的启动、暂停以及内存管理。理解这些概念对于编写高效、稳定的多线程应用程序至关重要。在实践中,应始终注意线程同步和内存管理的最佳实践,以避免可能出现的...

    Java/Android关于线程使用的总结

    ### Java/Android线程使用深度解析 在计算机科学领域,线程与进程是核心概念,尤其是在多任务操作系统中。...开发者应根据具体的应用场景和性能需求,合理选择和设计线程管理策略,以实现最佳的用户体验。

    Java 多线程学习总结6

    【Java多线程学习总结6】这篇博文主要探讨了Java平台上的多线程编程,这是一个核心的编程概念,尤其在服务器端应用和并发处理中至关重要。在Java中,多线程允许程序同时执行多个任务,提高了系统资源的利用率,提升...

    用户级线程的介绍,怎样实现多线程等等

    线程模型还有其他变体,例如"线程:进程"的比例可以是1:1、M:1(一个进程多个线程)、1:M(一个线程在多个进程中迁移)、M:N(综合模型)。这些模型根据具体的应用场景和系统特性进行选择,以达到最佳的并发性和资源...

    delphi7 多线程测试(40个线程)

    1. **线程切换开销**:操作系统在管理多线程时需要频繁地进行上下文切换,即保存和恢复线程状态。这个过程会消耗CPU时间和内存资源,当线程数量增加时,这些开销会显著增加。 2. **CPU核心限制**:大多数现代计算机...

    多线程及线程同步

    信号量在多线程编程中特别有用,例如限制同时打开的文件句柄数或数据库连接数。Windows系统提供了`CreateSemaphore`、`WaitForMultipleObjects`和`ReleaseSemaphore`等函数来管理和使用信号量。 总结来说,临界区、...

    XP 线程补丁 XP 线程 补丁

    在Windows XP操作系统中,线程是程序执行的基本单元...总结来说,Windows XP线程补丁是对系统线程管理功能的增强和修复,旨在提高系统性能和安全性。理解和正确应用线程补丁,对于提升用户体验和维护系统稳定至关重要。

    C++如何创建杀死线程

    无论是使用C++标准库还是Windows API,都应遵循最佳实践,确保线程的安全和资源的有效管理。 ### 五、进一步阅读 - [C++ Standard Library](http://eel.is/c++draft/thread) - [Windows Thread Functions]...

    线程相关可根据自定义的线程名字进行操作.zip

    在C#编程中,线程是程序执行的基本单元,它...通过这个项目,开发者不仅可以学习到如何操作线程,还能深入理解线程安全和多线程编程中的最佳实践。对于Windows Forms应用开发者来说,这是一个非常有价值的实践案例。

    CVI 03.多线程数据保护(线程锁)

    1. **互斥锁**:最基础的线程锁,确保任何时候只有一个线程可以访问受保护的代码段。在C++中,`std::mutex`就是互斥锁的实现。 2. **读写锁**:允许多个线程同时读取,但写入时仍然是互斥的。在Java中,`java.util....

    .NET多线程编程教程,_NET多线程编程实例

    本教程将深入探讨.NET多线程编程的核心概念、关键技术和最佳实践。 一、线程基础 1.1 线程定义:线程是程序执行的最小单元,每个线程代表了程序中的一个独立控制流,可以并发执行任务。 1.2 线程类型:主线程、工作...

    关于C# 多线程学习

    关于C#多线程学习,本篇将深入探讨在C#中...然而,需要注意的是,线程的管理并非没有挑战,不当的操作可能会导致程序出现各种难以预料的问题,因此,在实际应用中应遵循最佳实践和设计模式,确保线程的安全性和效率。

Global site tag (gtag.js) - Google Analytics