精华内容
下载资源
问答
  • 线程池动态修改核心线程数
    千次阅读
    2020-05-29 14:00:28

    通过线程池的方法重新设置核心线程数 setCorePoolSize

    当最新的核心线程数小于之前的核心线程数时,则需要进行多余的线程中断

    当最新的核心线程数大于之前的核心线程数,则需要逐步的增加核心线程数

    源码如下:

     public void setCorePoolSize(int corePoolSize) {
            if (corePoolSize < 0)
                throw new IllegalArgumentException();
            int delta = corePoolSize - this.corePoolSize;
            this.corePoolSize = corePoolSize;
            if (workerCountOf(ctl.get()) > corePoolSize)
                interruptIdleWorkers();
            else if (delta > 0) {
                // We don't really know how many new threads are "needed".
                // As a heuristic, prestart enough new workers (up to new
                // core size) to handle the current number of tasks in
                // queue, but stop if queue becomes empty while doing so.
                int k = Math.min(delta, workQueue.size());
                while (k-- > 0 && addWorker(null, true)) {
                    if (workQueue.isEmpty())
                        break;
                }
            }
        }

     

     备注:当最新的核心线程数大于之前核心线程数时,不是一致性增加差额的线程数,而是一个一个线程添加,添加完一个再去查询任务队列是否有任务;有任务则再次添加,没有任务则就此停止

    更多相关内容
  • 查看linux对用户的限制(ulimit -a),发现文件句柄和线程数的大小限制在1024,而通过查看应用实时线程发现数量超过了1100+(pstree -p `ps -e | grep pay | awk '{print $1}'` | wc -l)。通过jstack检查dump文件...

    因为最近支付系统总是报错无法创建新的线程导致交易失败,领导很重视。查看linux对用户的限制(ulimit -a),发现文件句柄和线程数的大小限制在1024,而通过查看应用实时线程发现数量超过了1100+(pstree -p `ps -e | grep pay | awk '{print $1}'` | wc -l)。通过jstack检查dump文件发现有大量由线程池创建的线程,并且状态为WAITING。则表明有很多空闲的线程在等待task分配。在仔细检查dump文件中,还发现有大量同名的线程,而且数量为10或者20。因为每个线程池的作用是不同的,且类似于thread-1的同名线程有多个,但是一个线程池中的线程ID是肯定不同的,所以大致猜测是不是线程池也创建了多个。经过分析代码确实找出了问题所在。因为线程池也创建了多个,而且设置了corePoolSize的大小,这个数量内的线程是不会被回收的。所以称此机会复习下线程池的。

    Executors类提供了4种常用的线程池。他门都是通过调用ThreadPoolExecutor一个默认的构造方法来实现不同的功能。

    int corePoolSize:核心线程数,当前线程数小于等于该值时,直接创建新的线程。

    int maximumPoolSize:极限线程数,当workQueue满之后,也会创建新的线程。也就是线程数其实是可以突破corePoolSize。

    long keepAliveTime:空闲线程的最大存活时间,但是这个是有条件的,必须为大于corePoolSize的线程才能被到期回收。

    TimeUnit unit:keepAliveTime的时间种类,可以选择秒或者毫秒等类型。

    BlockingQueue<Runnable> workQueue:当线程数大于corePoolSize时,会将任务放入workQueue,等候被线程执行。

    ThreadFactory threadFactory:创建线程的工厂,可以修改线程名。

    RejectedExecutionHandler handler:拒绝时任务处理器,当达到maximumPoolSize时,怎么办呢?你可以选择自己定制策略,也可以使用默认的:直接报错拒绝任务,这是一种比较安全的做法,毕竟以及达到最大线程数限制了。

    所以有两种解决的办法,重写相关线程池创建的逻辑(因为原逻辑这么作肯定有他的道理),或者使用缓存线程池,把corePoolSize设置为0,让全部的线程都受keepAliveTime的控制。

     

    展开全文
  • (1)一般平时cpu使用率4%以下,都是IO密集型,IO密集型具体看实践,目前项目里核心线程数设置50,最大线程数可以和核心线程数相同,队列配置大一些,使永远触发不到最大线程数 (2)如果是大量计算CPU使用率过高,...

    一、源码doc:

    java.util.concurrent public class ThreadPoolExecutor extends AbstractExecutorService

    一个ExecutorService ,它使用可能的多个池线程之一执行每个提交的任务,通常使用Executors工厂方法进行配置。

    线程池解决了两个不同的问题:由于减少了每个任务的调用开销,它们通常在执行大量异步任务时提供改进的性能,并且它们提供了一种限制和管理资源的方法,包括执行一组线程时消耗的线程。任务。每个ThreadPoolExecutor还维护一些基本的统计信息,例如完成任务的数量。

    为了在广泛的上下文中有用,这个类提供了许多可调整的参数和可扩展性挂钩。但是,建议程序员使用更方便的Executors工厂方法Executors.newCachedThreadPool (无界线程池,具有自动线程回收功能)、 Executors.newFixedThreadPool (固定大小的线程池)和Executors.newSingleThreadExecutor (单后台线程),这些方法预先配置了最常见的使用场景。否则,在手动配置和调整此类时使用以下指南:

    核心和最大池大小
    ThreadPoolExecutor将根据 corePoolSize (请参阅getCorePoolSize )和 maximumPoolSize (请参阅getMaximumPoolSize )设置的边界自动调整池大小(请参阅getPoolSize )。当在方法execute(Runnable)中提交了一个新任务,并且运行的线程少于 corePoolSize 时,即使其他工作线程处于空闲状态,也会创建一个新线程来处理该请求。如果运行的线程数多于 corePoolSize 但少于 maximumPoolSize,则仅当队列已满时才会创建新线程。通过将 corePoolSize 和 maximumPoolSize 设置为相同,您可以创建一个固定大小的线程池。通过将 maximumPoolSize 设置为基本上无界的值,例如Integer.MAX_VALUE ,您可以允许池容纳任意数量的并发任务。最典型的是,核心和最大池大小仅在构造时设置,但它们也可以使用setCorePoolSize和setMaximumPoolSize动态更改。
    按需施工
    默认情况下,即使是核心线程也仅在新任务到达时才最初创建和启动,但这可以使用方法prestartCoreThread或prestartAllCoreThreads动态覆盖。如果您使用非空队列构造池,您可能希望预启动线程。
    创建新线程
    新线程是使用ThreadFactory创建的。如果没有另外指定,则使用 E Executors.defaultThreadFactory ,它创建的线程都在同一个ThreadGroup中,并且具有相同的NORM_PRIORITY优先级和非守护进程状态。通过提供不同的 ThreadFactory,您可以更改线程的名称、线程组、优先级、守护进程状态等。如果ThreadFactory在从newThread返回 null 时未能创建线程,则执行程序将继续,但可能无法执行任何任务。线程应该拥有“modifyThread” RuntimePermission 。如果工作线程或其他使用该池的线程不具备此权限,则服务可能会降级:配置更改可能无法及时生效,关闭池可能会一直处于可以终止但未完成的状态。
    保活次数
    如果池当前有多个 corePoolSize 线程,多余的线程如果空闲时间超过 keepAliveTime(请参阅getKeepAliveTime(TimeUnit) )将被终止。这提供了一种在池没有被积极使用时减少资源消耗的方法。如果池稍后变得更加活跃,则将构造新线程。此参数也可以使用方法setKeepAliveTime(long, TimeUnit)动态更改。使用Long.MAX_VALUE TimeUnit.NANOSECONDS的值可以有效地禁止空闲线程在关闭之前终止。默认情况下,keep-alive 策略仅适用于超过 corePoolSize 线程的情况。但是方法allowCoreThreadTimeOut(boolean)也可用于将此超时策略应用于核心线程,只要 keepAliveTime 值不为零即可。
    排队
    任何BlockingQueue都可以用来传输和保存提交的任务。此队列的使用与池大小交互:

    • 如果运行的线程少于 corePoolSize,则 Executor 总是更喜欢添加新线程而不是排队。
    • 如果 corePoolSize 或更多线程正在运行,Executor 总是更喜欢排队请求而不是添加新线程。
    • 如果请求无法排队,则会创建一个新线程,除非这将超过 maximumPoolSize,在这种情况下,该任务将被拒绝。

    排队的一般策略有以下三种:

    1.直接交接。工作队列的一个很好的默认选择是SynchronousQueue ,它将任务交给线程而不用其他方式保留它们。在这里,如果没有立即可用的线程来运行任务,则尝试将任务排队将失败,因此将构造一个新线程。在处理可能具有内部依赖关系的请求集时,此策略可避免锁定。直接切换通常需要无限的 maximumPoolSizes 以避免拒绝新提交的任务。这反过来又承认了当命令的平均到达速度快于它们的处理速度时,线程无限增长的可能性。
    2.无界队列。当所有 corePoolSize 线程都忙时,使用无界队列(例如没有预定义容量的LinkedBlockingQueue )将导致新任务在队列中等待。因此,不会创建超过 corePoolSize 个线程。 (因此,maximumPoolSize 的值没有任何影响。)当每个任务完全独立于其他任务时,这可能是合适的,因此任务不会影响彼此的执行;例如,在网页服务器中。虽然这种排队方式在平滑请求的瞬时突发方面很有用,但它承认当命令平均到达速度快于处理速度时,工作队列可能会无限增长。
    3.有界队列。有界队列(例如ArrayBlockingQueue )在与有限的 maximumPoolSizes 一起使用时有助于防止资源耗尽,但可能更难以调整和控制。队列大小和最大池大小可以相互权衡:使用大队列和小池可以最大限度地减少 CPU 使用率、操作系统资源和上下文切换开销,但可能会导致人为地降低吞吐量。如果任务经常阻塞(例如,如果它们受 I/O 限制),系统可能能够为比您允许的更多线程安排时间。使用小队列通常需要更大的池大小,这会使 CPU 更忙,但可能会遇到不可接受的调度开销,这也会降低吞吐量。
    被拒绝的任务
    当 Executor 关闭时,以及 Executor 对最大线程和工作队列容量都使用有限的界限,并且已经饱和时,在方法execute(Runnable)中提交的新任务将被拒绝。无论哪种情况, execute方法都会调用其RejectedExecutionHandler的RejectedExecutionHandler.rejectedExecution(Runnable,ThreadPoolExecutor)方法。提供了四个预定义的处理程序策略:
    1.在默认的ThreadPoolExecutor.AbortPolicy中,处理程序在拒绝时抛出运行时RejectedExecutionException 。
    2.在ThreadPoolExecutor.CallerRunsPolicy中,调用execute本身的线程运行任务。这提供了一种简单的反馈控制机制,可以减慢提交新任务的速度。
    3.在ThreadPoolExecutor.DiscardPolicy中,无法执行的任务被简单地丢弃。
    4.在ThreadPoolExecutor.DiscardOldestPolicy中,如果 executor 没有关闭,则丢弃工作队列头部的任务,然后重试执行(可能再次失败,导致重复此操作。)

    可以定义和使用其他类型的RejectedExecutionHandler类。这样做需要小心谨慎,尤其是当策略设计为仅在特定容量或排队策略下工作时。
    挂钩方法
    此类提供protected的可beforeExecute(Thread, Runnable)和afterExecute(Runnable, Throwable)方法,这些方法在执行每个任务之前和之后调用。这些可用于操纵执行环境;例如,重新初始化 ThreadLocals、收集统计信息或添加日志条目。此外,可以重写方法terminated以执行任何特殊处理,一旦 Executor 完全终止需要完成。
    如果钩子或回调方法抛出异常,内部工作线程可能会依次失败并突然终止。
    队列维护
    方法getQueue()允许访问工作队列以进行监视和调试。强烈建议不要将此方法用于任何其他目的。当大量排队的任务被取消时,提供的两个方法remove(Runnable)和purge可用于协助存储回收。
    定稿
    程序中不再引用且没有剩余线程的池将自动shutdown 。如果您想确保即使用户忘记调用shutdown也能回收未引用的池,那么您必须通过设置适当的保持活动时间、使用零核心线程的下限和/或设置allowCoreThreadTimeOut(boolean)来安排未使用的线程最终死亡allowCoreThreadTimeOut(boolean) 。
    扩展示例。此类的大多数扩展都会覆盖一个或多个受保护的挂钩方法。例如,这是一个添加简单暂停/恢复功能的子类:

    class PausableThreadPoolExecutor extends ThreadPoolExecutor {
       private boolean isPaused;
       private ReentrantLock pauseLock = new ReentrantLock();
       private Condition unpaused = pauseLock.newCondition();
    
       public PausableThreadPoolExecutor(...) { super(...); }
    
       protected void beforeExecute(Thread t, Runnable r) {
         super.beforeExecute(t, r);
         pauseLock.lock();
         try {
           while (isPaused) unpaused.await();
         } catch (InterruptedException ie) {
           t.interrupt();
         } finally {
           pauseLock.unlock();
         }
       }
    
       public void pause() {
         pauseLock.lock();
         try {
           isPaused = true;
         } finally {
           pauseLock.unlock();
         }
       }
    
       public void resume() {
         pauseLock.lock();
         try {
           isPaused = false;
           unpaused.signalAll();
         } finally {
           pauseLock.unlock();
         }
       }
     }
    

    自从:1.5

    二、个人总结:

    1、核心线程数配置个数:看IO密集型,还是CPU密集型
    (1)一般平时cpu使用率4%以下,都是IO密集型,IO密集型核心线程数设置大小具体看实践,目前项目里核心线程数设置50,最大线程数可以和核心线程数相同,队列配置大一些,使永远触发不到最大线程数
    (2)如果是大量计算CPU使用率过高,属于CPU密集型,CPU密集型以4C8G为例,核心线程数一般设置4,最大线程数可以和核心线程数相同,队列配置大一些,使永远触发不到最大线程数

    2、核心线程数销毁
    (1)默认情况下,keep-alive 策略仅适用于超过 corePoolSize 线程的情况,没有任务会进行空跑, 和线程池生命周期一样, 除非线程池shutdown;但是方法allowCoreThreadTimeOut(boolean)也可用于将此超时策略应用于核心线程,只要 keepAliveTime 值不为零即可

    展开全文
  • 多线程线程数设置多少合适

    万次阅读 多人点赞 2020-06-30 01:15:04
    线程数的设置的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能,因此让我们一起去探索吧! 首先要考虑到 CPU 核心数,那么在 Java 中如何获取核心线程数? 可以使用 Runtime....

    前沿

    大家都用过线程池,但是线程池数量设置为多少比较合理呢?

    线程数的设置的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能,因此让我们一起去探索吧!

    首先要考虑到 CPU 核心数,那么在 Java 中如何获取核心线程数?

    可以使用 Runtime.getRuntime().availableProcessor() 方法来获取(可能不准确,作为参考)
    或者直接去服务器查看

    温故为什么使用线程

    场景

    如果有两个任务需要处理,一个任务A,一个任务B

    方案一:一个线程执行任务A和B,A执行完后,执行B
    方案二:两个线程A和B去执行任务A 和 B,同时进行

    哪个方案会快点?应该很多人会回答,肯定是方案二啊,多线程并行去处理任务A和B,肯定快啊。是这样吗?回答这个问题之前,先带着大家去回顾梳理一下。

    线程执行

    线程的执行,是由CPU进行调度的,一个CPU在同一时刻只会执行一个线程,我们看上去的线程A 和 线程B并发执行。

    为了让用户感觉这些任务正在同时进行,操作系统利用了时间片轮转的方式,CPU给每个任务都服务一定的时间,然后把当前任务的状态保存下来,在加载下一任务的状态后,继续服务下一任务。任务的状态保存及再加载,这段过程就叫做上下文切换。

    上下文切换过程是需要时间的;现在我们来看一下上面的问题,小伙伴们再看一下是哪个方案快呢?是不是有些小伙伴们会说方案一,因为不需要线程切换;方案二需要来回切换这两个线程,耗时会多点。

    小伙伴们心中此时是不是会有疑惑,那为什么会有多线程?先不急,再往下看。

    为什么要使用多线程

    小伙伴想想在我们真实业务中,我们是什么流程?
    在这里插入图片描述

    上图的流程:

    1、先发起网络请求

    2、Web服务器解析请求

    3、请求后端的数据库获取数据

    4、获取数据后,进行处理

    5、把处理结果放回给用户

    这个是我们处理业务的时候,常规的请求流程;我们看一下整个过程涉及到什么计算机处理。

    1、网络请求----->网络IO

    2、解析请求----->CPU

    3、请求数据库----->网络IO

    4、MySQL查询数据----->磁盘IO

    5、MySQL返回数据----->网络IO

    6、数据处理----->CPU

    7、返回数据给用户----->网络IO

    讲到这里,小伙伴们是不是感觉又不乱了,在真实业务中我们不单单会涉及CPU计算,还有网络IO和磁盘IO处理,这些处理是非常耗时的。如果一个线程整个流程是上图的流程,真正涉及到CPU的只有2个节点,其他的节点都是IO处理,那么线程在做IO处理的时候,CPU就空闲出来了,CPU的利用率就不高。

    小伙伴们现在知道多线程的用处了吧,对,就是为了提升CPU利用率。

    提升QPS/TPS

    衡量系统性能如何,主要指标系统的(QPS/TPS)

    QPS/TPS:每秒能够处理请求/事务的数量

    并发数:系统同时处理的请求/事务的数量

    响应时间:就是平均处理一个请求/事务需要时长

    QPS/TPS = 并发数/响应时间

    上面公式代表并发数越大,QPS就越大;所以很多人就会以为调大线程池,并发数就会大,也会提升QPS,所以才会出现一开始前言所说的,大多数人的误区。

    其实QPS还跟响应时间成反比,响应时间越大,QPS就会越小。

    虽然并发数调大了,就会提升QPS,但线程数也会影响响应时间,因为上面我们也提到了上下文切换的问题,那怎么设置线程数的呢?

    如何设置线程数

    那我们如何分配线程?我们提供一个公式:

    最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目

    备注:这个公式也是前辈们分享的,当然之前看了淘宝前台系统优化实践的文章,和上面的公式很类似,不过在CPU数目那边,他们更细化了,上面的公式只是参考。不过不管什么公式,最终还是在生产环境中运行后,再优化调整。

    我们继续上面的任务,我们的服务器CPU核数为4核,一个任务线程cpu耗时为20ms,线程等待(网络IO、磁盘IO)耗时80ms,那最佳线程数目:( 80 + 20 )/20 * 4 = 20。也就是设置20个线程数最佳。

    从这个公式上面我们就得出,线程的等待时间越大,线程数就要设置越大,这个正好符合我们上面的分析,可提升CPU利用率。那从另一个角度上面说,线程数设置多大,是根据我们自身的业务的,需要自己去压力测试,设置一个合理的数值。

    基础常规标准

    在确认了核心数后,再去判断是 CPU 密集型任务还是 IO 密集型任务:
    CPU 密集型任务:
    比如像加解密,压缩、计算等一系列需要大量耗费 CPU 资源的任务,大部分场景下都是纯 CPU 计算。
    IO 密集型任务:
    比如像 MySQL 数据库、文件的读写、网络通信等任务,这类任务不会特别消耗 CPU 资源,但是 IO 操作比较耗时,会占用比较多时间。

    1、CPU密集型:操作内存处理的业务,一般线程数设置为:CPU核数 + 1 或者 CPU核数*2。核数为4的话,一般设置 5 或 8

    2、IO密集型:文件操作,网络操作,数据库操作,一般线程设置为:cpu核数 / (1-0.9),核数为4的话,一般设置 40
    在知道如何判断任务的类别后,让我们分两个场景进行讨论:

    CPU 密集型任务

    对于 CPU 密集型计算,多线程本质上是提升多核 CPU 的利用率,所以对于一个 8 核的 CPU,每个核一个线程,理论上创建 8 个线程就可以了。

    如果设置过多的线程数,实际上并不会起到很好的效果。此时假设我们设置的线程数量是 CPU 核心数的 2 倍,因为计算任务非常重,会占用大量的 CPU 资源,所以这时 CPU 的每个核心工作基本都是满负荷的,而我们又设置了过多的线程,每个线程都想去利用 CPU 资源来执行自己的任务,这就会造成不必要的上下文切换,此时线程数的增多并没有让性能提升,反而由于线程数量过多会导致性能下降。

    因此,对于 CPU 密集型的计算场景,理论上线程的数量 = CPU 核数就是最合适的,不过通常把线程的数量设置为CPU 核数 +1,会实现最优的利用率。即使当密集型的线程由于偶尔的内存页失效或其他原因导致阻塞时,这个额外的线程也能确保 CPU 的时钟周期不会被浪费,从而保证 CPU 的利用率。

    如下图就是在一个 8 核 CPU 的电脑上,通过修改线程数来测试对 CPU 密集型任务(素数计算)的性能影响。
    在这里插入图片描述

    可以看到线程数小于 8 时,性能是很差的,在线程数多于处理器核心数对性能的提升也很小,因此可以验证公式还是具有一定适用性的。

    除此之外,我们最好还要同时考虑在同一台机器上还有哪些其他会占用过多 CPU 资源的程序在运行,然后对资源使用做整体的平衡。

    IO 密集型任务

    对于 IO 密集型任务最大线程数一般会大于 CPU 核心数很多倍,因为 IO 读写速度相比于 CPU 的速度而言是比较慢的,如果我们设置过少的线程数,就可能导致 CPU 资源的浪费。而如果我们设置更多的线程数,那么当一部分线程正在等待 IO 的时候,它们此时并不需要 CPU 来计算,那么另外的线程便可以利用 CPU 去执行其他的任务,互不影响,这样的话在任务队列中等待的任务就会减少,可以更好地利用资源。

    对于 IO 密集型计算场景,最佳的线程数是与程序中 CPU 计算和 IO 操作的耗时比相关的,《Java并发编程实战》的作者 Brain Goetz 推荐的计算方法如下:

    线程数 = CPU 核心数 * (1 + IO 耗时/ CPU 耗时)

    通过这个公式,我们可以计算出一个合理的线程数量,如果任务的平均等待时间长,线程数就随之增加,而如果平均工作时间长,也就是对于我们上面的 CPU 密集型任务,线程数就随之减少。可以采用 APM 工具统计到每个方法的耗时,便于计算 IO 耗时和 CPU 耗时。

    在这里引用Java并发编程实战中的图,方便大家更容易理解:
    在这里插入图片描述

    还有一派的计算方式是《Java虚拟机并发编程》中提出的:

    线程数 = CPU 核心数 / (1 - 阻塞系数)

    其中计算密集型阻塞系数为 0,IO 密集型阻塞系数接近 1,一般认为在 0.8 ~ 0.9 之间。比如 8 核 CPU,按照公式就是 2 / ( 1 - 0.9 ) = 20 个线程数
    在这里插入图片描述

    上图是 IO 密集型任务的一个测试,是在双核处理器上开不同的线程数(从 1 到 40)来测试对程序性能的影响,可以看到线程池数量达到 20 之后,曲线逐渐水平,说明开再多的线程对程序的性能提升也毫无帮助。

    太少的线程数会使得程序整体性能降低,而过多的线程也会消耗内存等其他资源,所以如果想要更准确的话,可以进行压测,监控 JVM 的线程情况以及 CPU 的负载情况,根据实际情况衡量应该创建的线程数,合理并充分利用资源。

    同时,有很多线程池的应用,比如 Tomcat、Redis、Jdbc 等,每个应用设置的线程数也是不同的,比如 Tomcat 为流量入口,那么线程数的设置可能就要比其他应用要大。

    总结

    通过对线程数设置的探究,我们可以得知线程数的设置首先和 CPU 核心数有莫大关联,除此之外,我们需要根据任务类型的不同选择对应的策略,具体的怎么设置要根据业务上需要/服务器的环境/QPS/TPS等指标等等有关系。
    线程的平均工作时间所占比例越高,就需要越少的线程;线程的平均等待时间所占比例越高,就需要越多的线程;增强cpu的使用率。
    针对不同的程序,进行对应的实际测试就可以得到最合适的选择。

    展开全文
  • linux下修改最大线程数

    千次阅读 2018-02-11 20:35:51
    0、利用 ulimit -a来查看当前用户的最大线程数1、利用 ulimit -u 4096(线程数)来临时修改当前用户下的最大线程数为4096,仅仅作用于当前会话2、修改配置文件,来改变用户下的最大线程数vi /etc/sec...
  • 匿名用户1级2017-07-18 回答展开全部tomcat最大线程数的设置Tomcat的server.xml中连接器设置如下maxThreads="150" minSpareThreads="25" maxSpareThreads="75"enableLookups="false" redirectPort="8443" ...
  • 1)maxThreads(最大线程数) 每一次HTTP请求到达Web服务器,Web服务器都会创建一个线程来处理该请求,该参数决定了应用服务同时可以处理多少个HTTP请求,tomcat默认为200; 2)accepCount(最大等待数) 当...
  • 修改linux系统用户最大线程数限制

    千次阅读 2018-06-26 11:47:13
    ulimit:显示(或设置)用户可以使用的资源的限制(limit),这限制分为软限制(当前限制)和硬限制(上限),其中硬限制是软限制的上限值,应用程序在运行过程中使用的系统资源不超过相应的软限制,任何的超越都...
  • Linux服务器 线程数和系统线程数

    千次阅读 2018-11-07 10:02:00
    1.查看服务器系统允许的最大线程数 ...可以修改允许最大的线程数 3.查看当前系统比较好资源的线程 top -H 4.ps -ef|grep tomcat (查看tomcat进程)如tomcat pid进程号为 5750 ps -Lf |wc -l -f 为全格式形式 wc...
  • Linux线程数和系统线程数查看

    千次阅读 2020-07-08 15:07:27
    1.查看服务器系统允许的最大线程数 ulimit -a 2. 修改配置文件 vim /etc/security/limits.d/20-nproc.conf # Default limit for number of user's processes to prevent # accidental fork bombs. # See rhbz #...
  • 只要是有数据读写的应用都有一个最大连接数和最大线程的配置,配置合理的最大连接数和线程数,可以有效防止应用崩溃 一. tomcat: tomcat是目前较为常用的Web容器,良好的配置能使用tomcat服务效率更高, 今天我...
  • 日东 OSP线程修改B-1版.zip三菱PLC编程案例源码资料编程控制器应用通讯通信例子程序实例日东 OSP线程修改B-1版.zip三菱PLC编程案例源码资料编程控制器应用通讯通信例子程序实例日东 OSP线程修改B-1版.zip三菱...
  • Docker环境undertow线程数不足问题探究

    千次阅读 2019-06-14 18:55:36
    Docker环境undertow线程数不足问题探究 背景 上篇Docker环境Spring Boot应用大量http请求超时,我们找到大量http请求超时原因:undertow的工作线程不足。 留下一些疑问:undertow默认配置是怎样的?为什么其他微服务...
  • 线程池动态调整线程数

    千次阅读 2019-09-09 16:12:08
    领导要动态实时调整任务的线程数,这真的是个什么烂需求,线程数不是应该根据cpu资源来评估调的最优值吗,但是领导既然说了,硬着头皮也得弄啊,还是具体研究一下,不能做也得给出个理由啊... 按照JDK文档的描述, ...
  • 我们使用C#编写一个应用程序(控制台或桌面程序都可以),然后运行这个程序,并打开windows任务管理器,这时我们就会看到这个应用程序中所含有的线程数,如下图所示。  如果任务管理器没有“线程数”列,可以...
  • CPU核心数与线程数详解

    万次阅读 多人点赞 2020-03-29 21:58:42
    CPU就是中央处理单元,物理CPU就是CPU的硬件个(socket)。 核心: 一开始,每个物理 cpu 上只有一个核心(a single core),对操作系统而言,也就是同一时刻只能运行一个进程/线程。 为了提高性能,cpu ...
  • 一, Sentinel基于并发线程数流控 采用基于线程数的限流模式...例如,当应用所依赖的下游应用由于某种原因导致服务不稳定、响应延迟增加,对于调用者来说,意味着吞吐量下降和更多的线程数占用,极端情况下甚至导致...
  • 前提说明 为了确保服务不会被过多的http长连接压垮,我们需要对tomcat设定个最大连接,超过这个...达到保护自己的同时起到连接负载均衡的作用。 动手去做 一开始根据故障todoList提供的参数MaxKeepAliveReques...
  • { "name": "Microsoft.AspNetCore.App", "version": "5.0.0" }, "configProperties": { "System.Threading.ThreadPool.MinThreads": 8 } } } configProperties=>最小线程数:因为使用了容器,不便修改此文件 ,考虑...
  • 关于Weblogic线程数调整

    千次阅读 2017-05-03 17:14:51
    一、背景 最近负责做一个平台的poc测试,性 能测试要求测试1000并发下平台的表现,web服务器采用的是weblogic,版本是11g,10.3.6,所有操作都是基于这个版本(因为以前修改 线程数的操作有些基于这个版本不能生效...
  • 会存在潜在的风险,当核心线程数都没有空闲时候,会一直往LinkedBlockingQueue存放。开始以为是因为到达核心数后一直存放到队列里会增加线程数量,但是做了个实验 public static void main(String[] ar...
  • 最大进程线程数 连接数

    千次阅读 2018-10-07 18:03:02
    ======================== ========================================================= ==============================================...吞吐量(TPS)、QPS、并发、响应时间(RT)概念 开发的原因,需要对...
  • Java 确定线程池中工作线程数的大小

    万次阅读 2018-09-12 16:20:17
    a、服务器cpu核数有限,所以同时并发或者并行的线程数是有限的,所以1核cpu设置1000个线程是没有意义的。  b、线程切换也是有开销的。频繁切换线程会使性能降低。 2、调用sleep()函数的时候,县城是否会占用着CPU...
  • 如何根据CPU数进行线程数设置

    千次阅读 2019-02-20 11:37:09
    太大了支撑不起,太小了浪费资源,怎么样最大化利用线程数? 一般说来,大家认为线程池的大小经验值应该这样设置:(其中n为CPU的个数) 如果是CPU密集型应用,则线程池大小设置为n+1 如果是IO密集型应用,则...
  • LINUX最大线程数及最大进程数

    万次阅读 2019-01-28 11:07:39
    查系统支持的最大线程数,一般会很大,相当于理论值 该命令在不同的机器上 值不一样。 在centos 服务器上面 : 513845 在ubuntu16.04 pc机上面 : 62667 两者机器配置 CPU 和内存 都不一样 cat /proc/sys/kernel/pid_...
  • linux系统中ulimit查看和更改系统限制ulimitulimit用于shell启动进程所占用的资源,可以用来设置系统的限制语法格式 ulimit [-acdfHlmnpsStvw] [size] 在/etc/security/limits.conf文件中定义 限制。 命令参数 ...
  • 1 查看当前用户的线程 ulimit -a 2 修改配置文件 ...4 修改可打开的最大文件 vi /etc/security/limits.conf 在文件的最后添加: 5 查看最大open files   这个参数root账户默认是65535,其他
  • CPU个数,核心数,线程数

    万次阅读 多人点赞 2018-08-14 09:29:07
    我们在买电脑的时候,经常会看cpu的参数,对cpu的描述有这几种:“双核”、“双核四线程”、“四核”、“四核四线程”、“四核八线程”……。 我们接触的电脑基本上都只有一个cup。cpu的个数很容易得到,螺丝刀拆开...
  • 浅谈系统线程数限制

    千次阅读 2018-07-29 12:36:21
    Linux进程与线程 概念就不提了,Richard Stevens的描述: &gt; fork is expensive. Memory is copied from the parent to the child, all descriptors are duplicated in the child, and so on. Current ...
  • IIS:连接数、并发连接数、最大并发工作线程数应用程序池的队列长度、应用程序池的最大工作进程数详解 iis性能指标的各种概念:连接数、并发连接数、最大并发工作线程数应用程序池的队列长度、应用程序池的最大...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 642,656
精华内容 257,062
关键字:

修改应用线程数