精华内容
下载资源
问答
  • weblogic9修改线程数

    2009-12-31 14:01:37
    移植到weblogic9上,同样的应用会因为获取不到数据库连接的错误而崩溃,经同事研究发现原因是weblogic9默认配置提供的可用连接太少(4)所致,可是weblogic9控制台又没有提供修改链接的功能,经多方请教,最后...

        我们的应用在tomcat上一直运行正常,移植到weblogic9上,同样的应用会因为获取不到数据库连接的错误而崩溃,经同事研究发现原因是weblogic9默认配置提供的可用连接数太少(4)所致,可是weblogic9控制台又没有提供修改链接数的功能,经多方请教,最后找到解决方法如下:

    1、修改weblogic domain的config.xml文件,在对应位置加入红色标注的两行内容:

        <server>
              <name>admserver</name>
              <self-tuning-thread-pool-size-min>5</self-tuning-thread-pool-size-min>
              <self-tuning-thread-pool-size-max>15</self-tuning-thread-pool-size-max>
              ...
         </server>

    2、在startweblogic.cmd脚本中加入一下java启动参数:

         -Dweblogic.configuration.schemaValidationEnabled=false

     

    展开全文
  • 1)maxThreads(最大线程数) 每一次HTTP请求到达Web服务器,Web服务器都会创建一个线程来处理该请求,该参数决定了应用服务同时可以处理多少个HTTP请求,tomcat默认为200; 2)accepCount(最大等待数) 当...
      1)maxThreads(最大线程数)
         每一次HTTP请求到达Web服务器,Web服务器都会创建一个线程来处理该请求,该参数决定了应用服务同时可以处理多少个HTTP请求,tomcat默认为200;
      
      2)accepCount(最大等待数)
         当调用Web服务的HTTP请求数达到tomcat的最大线程数时,还有新的HTTP请求到来,这时tomcat会将该请求放在等待队列中,这个acceptCount就是指能够接受的最大等待数,默认100.如果等待队列也被放满了,这个时候再来新的请求就会被tomcat拒绝(connection refused);
      
      3)maxConnections(最大连接数)
         这个参数是指在同一时间,tomcat能够接受的最大连接数。一般这个值要大于maxThreads+acceptCount。
       根据公司用户量及机器配置信息,公司的最大连接数、最大线程数和最大等待数优化为:
       #最大连接数
       server.tomcat.max-connections=2000
       #最大线程数
       server.tomcat.max-threads=1000
       #最大等待数
       server.tomcat.accept-count=800
    

    Spring Boot 默认支持的并发量

    Tomcat的最大线程数是200,
    最大连接数是10000。

     

    展开全文
  • 修改linux系统用户最大线程数限制

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

    ulimit 的作用

    ulimit:显示(或设置)用户可以使用的资源的限制(limit),这限制分为软限制(当前限制)和硬限制(上限),其中硬限制是软限制的上限值,应用程序在运行过程中使用的系统资源不超过相应的软限制,任何的超越都导致进程的终止。

    参数 描述

    ulimited 不限制用户可以使用的资源,但本设置对可打开的最大文件数(max open files)和可同时运行的最大进程数(max user processes)无效

    -a 列出所有当前资源极限
    -c 设置core文件的最大值.单位:blocks
    -d 设置一个进程的数据段的最大值.单位:kbytes
    -f Shell 创建文件的文件大小的最大值,单位:blocks
    -h 指定设置某个给定资源的硬极限。如果用户拥有 root 用户权限,可以增大硬极限。任何用户均可减少硬极限
    -l 可以锁住的物理内存的最大值
    -m 可以使用的常驻内存的最大值,单位:kbytes
    -n 每个进程可以同时打开的最大文件数
    -p 设置管道的最大值,单位为block,1block=512bytes
    -s 指定堆栈的最大值:单位:kbytes
    -S 指定为给定的资源设置软极限。软极限可增大到硬极限的值。如果 -H 和 -S 标志均未指定,极限适用于以上二者
    -t 指定每个进程所使用的秒数,单位:seconds
    -u 可以运行的最大并发进程数
    -v Shell可使用的最大的虚拟内存,单位:kbytes
    -x

    添加格式

    username|@groupname type resource limit

    • username|@groupname:设置需要被限制的用户名,组名前面加@和用户名区别。也可以用通配符*来做所有用户的限制。
    • type:有soft,hard 和 -,soft 指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值。soft 的限制不能比har 限制高。用 - 就表明同时设置了 soft 和 hard 的值。
    • resource:
      core - 限制内核文件的大小(kb)
      date - 最大数据大小(kb)
      fsize - 最大文件大小(kb)
      memlock - 最大锁定内存地址空间(kb)
      nofile - 打开文件的最大数目
      rss - 最大持久设置大小(kb)
      stack - 最大栈大小(kb)
      cpu - 以分钟为单位的最多CPU 时间
      noproc - 进程的最大数目
      as - 地址空间限制
      maxlogins - 此用户允许登录的最大数目

    Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数

        ulimit -n 4096 将每个进程可以打开的文件数目加大到4096,缺省为1024
        其他建议设置成无限制(unlimited)的一些重要设置是:
        数据段长度:ulimit -d unlimited
        最大内存大小:ulimit -m unlimited
        堆栈大小:ulimit -s unlimited
        CPU 时间:ulimit -t unlimited
        虚拟内存:ulimit -v unlimited

    永久修改ulimit,需要修改/etc/security/limits.conf。

    # vim /etc/security/limits.conf 
    
         # 添加如下的行
        * soft noproc 65535
        * hard noproc 65535
        * soft nofile 65535
        * hard nofile 65535

    (前面的*星号代表针对所有的用户;noproc 是代表最大进程数;nofile代表最大文件打开数;soft nofile的值不能超过hard nofile的值)

    报错信息

    tomcat启动后老是报错:java.lang.OutOfMemoryError: unable to create new native thread,

    刚开始以为内存不够就增加tomcat内存:
    JAVA_OPTS="-server -XX:PermSize=1024M -XX:MaxPermSize=2048m -DentityExpansionLimit=64000"
    结果还是报这个错,后来怀疑是权限问题,使用root用户启动tomcat就好了。
    经过分析,原来linux用户默认能够创建的最大线程数是1024,所以才会报这个错误。

    下面,介绍一下修改linux系统用户最大线程数限制:
    linux系统对线程数量有个最大限制,当达到系统限制的最大线程数时使用账号密码ssh到系统时是无法登陆的,会报Write failed: Broken pipe,在root用户下切换到该用户会报 su: 无法设置用户ID: 资源暂时不可用
    1.# su - xxx(普通用户)
    su: 无法设置用户ID: 资源暂时不可用

    2.# ulimit -u
    1024
    由此可以看出最大线程数为1024

    3.修改最大线程数的配置
    centos6.5

    [root@localhost ~]# cat /etc/security/limits.d/90-nproc.conf
    \\内容如下:
    *          soft    nproc     1024
    root       soft    nproc     unlimited

    centos7

    [root@localhost ~]# cat /etc/security/limits.d/20-nproc.conf
    \\内容如下:
    *          soft    nproc     1024
    root       soft    nproc     unlimited

    上面可以看除了root用户外的所有用户均限制为1024,因此可以注释此行或者将值改大来解决,这样的修改是立马生效的

    转载于:https://blog.51cto.com/qiangsh/2132763

    展开全文
  • 场景一:实现一些批量处理数据的功能,刚开始线程池的核心线程数设的比较小,然后想调整下,只能改完后重启应用。场景二:有一个任务处理的应用,会接收 MQ 的消息进行任务的处理,线程池的队列也允许缓存一定数量的...

    阐述背景

    线程池在日常工作中用的还挺多,当需要异步,批量处理一些任务的时候我们会定义一个线程池来处理。

    在使用线程池的过程中有一些问题,下面简单介绍下之前遇到的一些问题。

    场景一:实现一些批量处理数据的功能,刚开始线程池的核心线程数设的比较小,然后想调整下,只能改完后重启应用。

    场景二:有一个任务处理的应用,会接收 MQ 的消息进行任务的处理,线程池的队列也允许缓存一定数量的任务。当任务处理的很慢的时候,想看看到底有多少没有处理完不是很方便。当时为了快速方便,就直接启动了一个线程去循环打印线程池队列的大小。

    正好之前在我公众号有转发过美团的一篇线程池应用的文章(https://mp.weixin.qq.com/s/tIWAocevZThfbrfWoJGa9w),觉得他们的思路非常好,就是没有开放源码,所以自己就抽时间在我的开源项目 Kitty 中增加了一个动态线程池的组件,支持了 Cat 监控,动态变更核心参数,任务堆积告警等。今天就给大家分享一下实现的方式。

    使用方式

    添加依赖

    依赖线程池的组件,目前 Kitty 未发布,需要自己下载源码 install 本地或者私有仓库。

    com.cxytiandi

    kitty-spring-cloud-starter-dynamic-thread-pool

    添加配置

    然后在 Nacos 配置线程池的信息,我的这个整合了 Nacos。推荐一个应用创建一个单独的线程池配置文件,比如我们这个叫 dataId 为 kitty-cloud-thread-pool.properties,group 为 BIZ_GROUP。

    内容如下:

    kitty.threadpools.nacosDataId=kitty-cloud-thread-pool.properties

    kitty.threadpools.nacosGroup=BIZ_GROUP

    kitty.threadpools.accessToken=ae6eb1e9e6964d686d2f2e8127d0ce5b31097ba23deee6e4f833bc0a77d5b71d

    kitty.threadpools.secret=SEC6ec6e31d1aa1bdb2f7fd5eb5934504ce09b65f6bdc398d00ba73a9857372de00

    kitty.threadpools.owner=尹吉欢

    kitty.threadpools.executors[0].threadPoolName=TestThreadPoolExecutor

    kitty.threadpools.executors[0].corePoolSize=4

    kitty.threadpools.executors[0].maximumPoolSize=4

    kitty.threadpools.executors[0].queueCapacity=5

    kitty.threadpools.executors[0].queueCapacityThreshold=5

    kitty.threadpools.executors[1].threadPoolName=TestThreadPoolExecutor2

    kitty.threadpools.executors[1].corePoolSize=2

    kitty.threadpools.executors[1].maximumPoolSize=4

    nacosDataId,nacosGroup

    监听配置修改的时候需要知道监听哪个 DataId,值就是当前配置的 DataId。

    accessToken,secret

    钉钉机器人的验证信息,用于告警。

    owner

    这个应用的负责人,告警的消息中会显示。

    threadPoolName

    线程池的名称,使用的时候需要关注。

    剩下的配置就不一一介绍了,跟线程池内部的参数一致,还有一些可以查看源码得知。

    注入使用

    @Autowired

    private DynamicThreadPoolManager dynamicThreadPoolManager;

    dynamicThreadPoolManager.getThreadPoolExecutor("TestThreadPoolExecutor").execute(() -> {

    log.info("线程池的使用");

    try {

    Thread.sleep(30000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }, "getArticle");

    通过 DynamicThreadPoolManager 的 getThreadPoolExecutor 方法获取线程池对象,然后传入 Runnable,Callable 等。第二个参数是这个任务的名称,之所以要扩展一个参数是因为如果任务没有标识,那么无法区分任务。

    这个线程池组件默认集成了 Cat 打点,设置了名称可以在 Cat 上查看这个任务相关的监控数据。

    扩展功能

    任务执行情况监控

    在 Cat 的 Transaction 报表中会以线程池的名称为类型显示。

    52dcfe40420b56be491f6d430d5186cd.png

    详情中会以任务的名称显示。

    d132401ce8f63863e7efe7524ead5399.png

    核心参数动态修改

    核心参数目前只支持 corePoolSize,maximumPoolSize,queueCapacity(队列类型为 LinkedBlockingDeque 才可以修改),rejectedExecutionType,keepAliveTime,unit 这些参数的修改。

    一般 corePoolSize,maximumPoolSize,queueCapacity 是最常要动态改变的。

    需要改动的话直接在 Nacos 中将对应的配置值修改即可,客户端会监听配置的修改,然后同步修改先线程池的参数。

    队列容量告警

    queueCapacityThreshold 是队列容量告警的阀值,如果队列中的任务数量超过了 queueCapacityThreshold 就会告警。

    935d013faac40181a65fd4eae06b9bd7.png

    拒绝次数告警

    当队列容量满了后,新进来的任务会根据用户设置的拒绝策略去选择对应的处理方式。如果是采用 AbortPolicy 策略,也会进行告警。相当于消费者已经超负荷了。

    3303f5f0f1e07a2c9430fd230fe1ba39.png

    线程池运行情况

    底层对接了 Cat,所以将线程的运行数据上报给了 Cat。我们可以在 Cat 中查看这些信息。

    ac40d5b89faa88278873aa39f740a407.png

    如果你想在自己的平台去展示,我这边暴露了/actuator/thread-pool 端点,你可以自行拉取数据。

    {

    threadPools: [{

    threadPoolName: "TestThreadPoolExecutor",

    activeCount: 0,

    keepAliveTime: 0,

    largestPoolSize: 4,

    fair: false,

    queueCapacity: 5,

    queueCapacityThreshold: 2,

    rejectCount: 0,

    waitTaskCount: 0,

    taskCount: 5,

    unit: "MILLISECONDS",

    rejectedExecutionType: "AbortPolicy",

    corePoolSize: 4,

    queueType: "LinkedBlockingQueue",

    completedTaskCount: 5,

    maximumPoolSize: 4

    }, {

    threadPoolName: "TestThreadPoolExecutor2",

    activeCount: 0,

    keepAliveTime: 0,

    largestPoolSize: 0,

    fair: false,

    queueCapacity: 2147483647,

    queueCapacityThreshold: 2147483647,

    rejectCount: 0,

    waitTaskCount: 0,

    taskCount: 0,

    unit: "MILLISECONDS",

    rejectedExecutionType: "AbortPolicy",

    corePoolSize: 2,

    queueType: "LinkedBlockingQueue",

    completedTaskCount: 0,

    maximumPoolSize: 4

    }]

    }

    自定义拒绝策略

    平时我们使用代码创建线程池可以自定义拒绝策略,在构造线程池对象的时候传入即可。这里由于创建线程池都被封装好了,我们只能在 Nacos 配置拒绝策略的名称来使用对应的策略。默认是可以配置 JDK 自带的 CallerRunsPolicy,AbortPolicy,DiscardPolicy,DiscardOldestPolicy 这四种。

    如果你想自定义的话也是支持的,定义方式跟以前一样,如下:

    @Slf4j

    public class MyRejectedExecutionHandler implements RejectedExecutionHandler {

    @Override

    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {

    log.info("进来了。。。。。。。。。");

    }

    }

    要让这个策略生效的话使用的是 SPI 的方式,需要在 resources 下面创建一个 META-INF 的文件夹,然后创建一个 services 的文件夹,再创建一个 java.util.concurrent.RejectedExecutionHandler 的文件,内容为你定义的类全路径。

    2e389d45289e42771537c9b970b40e9d.png

    自定义告警方式

    默认是内部集成了钉钉机器人的告警方式,如果你不想用也可以将其关闭。或者将告警信息对接到你的监控平台去。

    如果没有告警平台也可以在项目中实现新的告警方式,比如短信等。

    只需要实现 ThreadPoolAlarmNotify 这个类即可。

    /**

    * 自定义短信告警通知

    *

    * @作者 尹吉欢

    * @个人微信 jihuan900

    * @微信公众号 猿天地

    * @GitHub https://github.com/yinjihuan

    * @作者介绍 http://cxytiandi.com/about

    * @时间 2020-05-27 22:26

    */

    @Slf4j

    @Component

    public class ThreadPoolSmsAlarmNotify implements ThreadPoolAlarmNotify {

    @Override

    public void alarmNotify(AlarmMessage alarmMessage) {

    log.info(alarmMessage.toString());

    }

    }

    代码实现

    创建线程池

    根据配置创建线程池,ThreadPoolExecutor 是自定义的,因为需要做 Cat 埋点。

    /**

    * 创建线程池

    * @param threadPoolProperties

    */

    private void createThreadPoolExecutor(DynamicThreadPoolProperties threadPoolProperties) {

    threadPoolProperties.getExecutors().forEach(executor -> {

    KittyThreadPoolExecutor threadPoolExecutor = new KittyThreadPoolExecutor(

    executor.getCorePoolSize(),

    executor.getMaximumPoolSize(),

    executor.getKeepAliveTime(),

    executor.getUnit(),

    getBlockingQueue(executor.getQueueType(), executor.getQueueCapacity(), executor.isFair()),

    new KittyThreadFactory(executor.getThreadPoolName()),

    getRejectedExecutionHandler(executor.getRejectedExecutionType(), executor.getThreadPoolName()), executor.getThreadPoolName());

    threadPoolExecutorMap.put(executor.getThreadPoolName(), threadPoolExecutor);

    });

    }

    刷新线程池

    首先需要监听 Nacos 的修改。

    /**

    * 监听配置修改,spring-cloud-alibaba 2.1.0版本不支持@NacosConfigListener的监听

    */

    public void initConfigUpdateListener(DynamicThreadPoolProperties dynamicThreadPoolProperties) {

    ConfigService configService = nacosConfigProperties.configServiceInstance();

    try {

    configService.addListener(dynamicThreadPoolProperties.getNacosDataId(), dynamicThreadPoolProperties.getNacosGroup(), new AbstractListener() {

    @Override

    public void receiveConfigInfo(String configInfo) {

    new Thread(() -> refreshThreadPoolExecutor()).start();

    log.info("线程池配置有变化,刷新完成");

    }

    });

    } catch (NacosException e) {

    log.error("Nacos配置监听异常", e);

    }

    }

    然后再刷新线程池的参数信息,由于监听事件触发的时候,这个时候配置其实还没刷新,所以我就等待了 1 秒钟,让配置完成刷新然后直接从配置类取值。

    虽然有点挫还是可以用,其实更好的方式是解析 receiveConfigInfo 那个 configInfo,configInfo 就是改变之后的整个配置内容。因为不太好解析成属性文件,就没做,后面再改吧。

    /**

    * 刷新线程池

    */

    private void refreshThreadPoolExecutor() {

    try {

    // 等待配置刷新完成

    Thread.sleep(1000);

    } catch (InterruptedException e) {

    }

    dynamicThreadPoolProperties.getExecutors().forEach(executor -> {

    ThreadPoolExecutor threadPoolExecutor = threadPoolExecutorMap.get(executor.getThreadPoolName());

    threadPoolExecutor.setCorePoolSize(executor.getCorePoolSize());

    threadPoolExecutor.setMaximumPoolSize(executor.getMaximumPoolSize());

    threadPoolExecutor.setKeepAliveTime(executor.getKeepAliveTime(), executor.getUnit());

    threadPoolExecutor.setRejectedExecutionHandler(getRejectedExecutionHandler(executor.getRejectedExecutionType(), executor.getThreadPoolName()));

    BlockingQueue queue = threadPoolExecutor.getQueue();

    if (queue instanceof ResizableCapacityLinkedBlockIngQueue) {

    ((ResizableCapacityLinkedBlockIngQueue) queue).setCapacity(executor.getQueueCapacity());

    }

    });

    }

    其他的刷新都是线程池自带的,需要注意的是线程池队列大小的刷新,目前只支持 LinkedBlockingQueue 队列,由于 LinkedBlockingQueue 的大小是不允许修改的,所以按照美团那篇文章提供的思路,自定义了一个可以修改的队列,其实就是把 LinkedBlockingQueue 的代码复制了一份,改一下就可以。

    往 Cat 上报运行信息

    往 Cat 的 Heartbeat 报表上传数据的代码如下,主要还是 Cat 本身提供了扩展的能力。只需要定时去调用下面的方式上报数据即可。

    public void registerStatusExtension(ThreadPoolProperties prop, KittyThreadPoolExecutor executor) {

    StatusExtensionRegister.getInstance().register(new StatusExtension() {

    @Override

    public String getId() {

    return "thread.pool.info." + prop.getThreadPoolName();

    }

    @Override

    public String getDescription() {

    return "线程池监控";

    }

    @Override

    public Map getProperties() {

    AtomicLong rejectCount = getRejectCount(prop.getThreadPoolName());

    Map pool = new HashMap<>();

    pool.put("activeCount", String.valueOf(executor.getActiveCount()));

    pool.put("completedTaskCount", String.valueOf(executor.getCompletedTaskCount()));

    pool.put("largestPoolSize", String.valueOf(executor.getLargestPoolSize()));

    pool.put("taskCount", String.valueOf(executor.getTaskCount()));

    pool.put("rejectCount", String.valueOf(rejectCount == null ? 0 : rejectCount.get()));

    pool.put("waitTaskCount", String.valueOf(executor.getQueue().size()));

    return pool;

    }

    });

    }

    定义线程池端点

    通过自定义端点来暴露线程池的配置和运行的情况,可以让外部的监控系统拉取数据做对应的处理。

    @Endpoint(id = "thread-pool")

    public class ThreadPoolEndpoint {

    @Autowired

    private DynamicThreadPoolManager dynamicThreadPoolManager;

    @Autowired

    private DynamicThreadPoolProperties dynamicThreadPoolProperties;

    @ReadOperation

    public Map threadPools() {

    Map data = new HashMap<>();

    List threadPools = new ArrayList<>();

    dynamicThreadPoolProperties.getExecutors().forEach(prop -> {

    KittyThreadPoolExecutor executor = dynamicThreadPoolManager.getThreadPoolExecutor(prop.getThreadPoolName());

    AtomicLong rejectCount = dynamicThreadPoolManager.getRejectCount(prop.getThreadPoolName());

    Map pool = new HashMap<>();

    Map config = JSONObject.parseObject(JSONObject.toJSONString(prop), Map.class);

    pool.putAll(config);

    pool.put("activeCount", executor.getActiveCount());

    pool.put("completedTaskCount", executor.getCompletedTaskCount());

    pool.put("largestPoolSize", executor.getLargestPoolSize());

    pool.put("taskCount", executor.getTaskCount());

    pool.put("rejectCount", rejectCount == null ? 0 : rejectCount.get());

    pool.put("waitTaskCount", executor.getQueue().size());

    threadPools.add(pool);

    });

    data.put("threadPools", threadPools);

    return data;

    }

    }

    Cat 监控线程池中线程的执行时间

    本来是将监控放在 KittyThreadPoolExecutor 的 execute,submit 方法里的。后面测试下来发现有问题,数据在 Cat 上确实有了,但是执行时间都是 1 毫秒,也就是没生效。

    不说想必大家也知道,因为线程是后面单独去执行的,所以再添加任务的地方埋点没任务意义。

    后面还是想到了一个办法来实现埋点的功能,就是利用线程池提供的 beforeExecute 和 afterExecute 两个方法,在线程执行之前和执行之后都会触发这两个方法。

    @Override

    protected void beforeExecute(Thread t, Runnable r) {

    String threadName = Thread.currentThread().getName();

    Transaction transaction = Cat.newTransaction(threadPoolName, runnableNameMap.get(r.getClass().getSimpleName()));

    transactionMap.put(threadName, transaction);

    super.beforeExecute(t, r);

    }

    @Override

    protected void afterExecute(Runnable r, Throwable t) {

    super.afterExecute(r, t);

    String threadName = Thread.currentThread().getName();

    Transaction transaction = transactionMap.get(threadName);

    transaction.setStatus(Message.SUCCESS);

    if (t != null) {

    Cat.logError(t);

    transaction.setStatus(t);

    }

    transaction.complete();

    transactionMap.remove(threadName);

    }

    后面的代码大家自己去看就行了,本文到这里就结束了。如果感觉本文还不错的记得转发下哦!

    多谢多谢。

    最后感谢美团技术团队的那篇文章,虽然没有分享源码,但是思路什么的和应用场景都讲的很明白。

    关于作者:尹吉欢,简单的技术爱好者,《Spring Cloud 微服务-全栈技术与案例解析》, 《Spring Cloud 微服务 入门 实战与进阶》作者, 公众号 猿天地 发起人。个人微信 jihuan900,欢迎勾搭。

    展开全文
  • tomcat 调整线程数

    千次阅读 2010-12-14 14:26:00
    调整线程数 另外一个可通过应用程序的连接器(Connector)进行性能控制的的参数是创建的处理请求的线程数。Tomcat使用线程池加速响应速度来处理请求。在Java中线程是程序运行时的路径,是在一个程序中与其它控制...
  • 一、背景 最近负责做一个平台的...线程数的操作有些基于这个版本不能生效)。在LoadRunner压1000并发下,发现应用表现并不好,响应时间明显增加。 二、分析 监 控服务器资源,发现集群平台服务器负载并不高,而w...
  • tomcat内存和线程数配置

    千次阅读 2014-06-25 14:46:57
    一、Tomcat的JVM提示内存溢出 查看%TOMCAT_HOME%\logs文件夹下,日志文件是否有内存溢出...Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,有可能导致系统无法运行。常见的问题是报Tom
  • weblogic9线程数调整

    2015-06-17 08:48:58
    移植到weblogic9上,同样的应用会因为获取不到数据库连接的错误而崩溃,经同事研究发现原因是weblogic9默认配置提供的可用连接太少(4)所致,可是weblogic9控制台又没有提供修改链接的功能,经多方请教,最后...
  • 关于Weblogic线程数的几点使用

    千次阅读 2015-06-17 09:59:00
    最近负责做一个平台的poc测试,性能测试要求测试1000并发下平台的表现,web服务器采用的是weblogic,版本是11g,10.3.6,所有操作都是基于这个版本(因为以前修改线程数的操作有些基于这个版本不能生效)。...
  • 究其原因是因为该用户账号下启动的应用程序占用的线程数超出限制造成的,修改用户线程数即可解决。打开相应的配置文件,如下:[root@super7 etc]# cd /etc/security/limits.d/ [root@super7 limits.d]# ls 90-npr...
  • 当大型的应用需要创建几十万的线程时,需要修改linux的系统值,以支持这样的应用,相关的参数调整为: 1.ulimit 的参数调整 ulimit -s ulimit -u ulimit -n 可以修改/etc/security/limits.conf文件,使其永久...
  • 无需任何重新编译,代码修改或操作系统安装,它便能够在运行时自动找到并行区域的最佳线程数,以及所有区域(即并行和顺序)的最佳涡轮增压模式。并行应用程序。 它有两个版本: (I)波塞冬(Poseidon)细粒度:...
  • weblogic10配置线程数

    2011-03-30 14:38:56
    下面给介绍一下简单的调优,也是跟weblogic81不同的地方: 1)weblogic81直接在startWebLogic.sh中加入...2)在8.1版本中,我们可以利用console进行thread pool的配置,根据应用的需求增加新的thread pool或者修改...
  •  这种情况常见于高并发访问文件系统,多线程网络连接等场景。程序经常访问的文件、socket在Linux中都是文件file,系统需要记录每个当前访问file的name、location、access authority等相关信息,这样的一个实体被...
  • 11-13)*修正了参数 实现了线程、线程池创建时可以调整初始栈大小来突破单进程1500线程数限制*部分控件移除了汇编加减法的调用(效率存在问题)5.2.0(2016-8-20)*封装了一些和线程应用息息相关的函数----------------...
  • 摘要:在多实例多线程情况下,ActiveX 组件的不同实例共享同一全局数据缓冲区,在改造集成面向过程开发的传统代码时必须修改代码以消除全部全局变量。针对该情况,使用线程局部存储技术实现全局变量的局部化,采用...
  •  这种情况常见于高并发访问文件系统,多线程网络连接等场景。程序经常访问的文件、socket在Linux中都是文件file,系统需要记录每个当前访问file的name、location、access authority等相关信息,这样的一个实体被...
  • 生成800个随机数(用图形描述的时候每个占一个像素点)用ArrayList存储每个点的长度(此处用矩形来画线,方便以后宽度的更改),每种排序都用一个线程来执行,每次赋值(冒泡和2路太慢,所以做了适当修改)都暂停1...
  • 摘要:在多实例多线程情况下,ActiveX 组件的不同实例共享同一全局数据缓冲区,在改造集成面向过程开发的传统代码时必须修改代码以消除全部全局变量。针对该情况,使用线程局部存储技术实现全局变量的局部化,采用...
  • 这种情况常见于高并发访问文件系统,多线程网络连接等场景。程序经常访问的文件、socket在Linux中都是文件file,系统需要记录每个当前访问file的name、location、access authority等相关信息,这样的一个实体被称为...
  • 1.读写锁ReadWriteLock ReadWriteLock 维护了一对相关的锁,一个用于只读操作——读锁,另一个用于...虽然一次只有一个线程(writer 线程)可以修改共享数据,但在许多情况下,任何数量的线程可以同时读取共享...
  • 线程通信

    2015-08-21 08:45:55
    一般可以有两种方式来实现线程间通信:1、使用全局变量2、使用自定义消息 1、利用全局变量来实现线程通信 通过一个例子来理解 ...实现:(1)用MFC创建一个基于对话框的应用程序,将ok按钮的标题修改为结

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 692
精华内容 276
关键字:

修改应用线程数