首页 > 其他分享 >线程饥饿导致性能下降

线程饥饿导致性能下降

时间:2023-05-31 19:12:13浏览次数:39  
标签:异步 性能 程序 池中 饥饿 线程 CPU

线上反馈signalR推送有延期

CPU 和 内存 都是 90% 左右,由于经费的问题,让我们先尝试优化代码。

看了一下核心代码设置了信号量为50,限制速度。果断增大为100。

 生产环境更新后,一点作用都没有,高峰期还是有延期,作用不大。

最后发现当前服务器有有一个报表服务,下午跑报表抢占了线程资源,导致signalR服务处理慢。只能在signalR服务 的 ThreadPool.SetMinThreads 设置线程池中最小的工作线程数和异步 I/O 线程数,优先保证当前服务的运行

 总结

.NET 线程饥饿(Thread Starvation)是指程序在没有足够的资源来满足所有线程请求时,某些线程无法获取所需的资源并处于阻塞状态,从而导致整个程序的吞吐量下降、响应时间变慢的现象。

.NET 中常见的线程饥饿包括:

  1. CPU 饥饿:当程序中存在大量密集型计算任务时,如果线程池中的工作线程数不足,这些计算任务就会争夺 CPU 资源,而其他线程则无法得到充分利用,从而导致线程饥饿。

  2. I/O 饥饿:当程序中存在大量 I/O 操作时,如果线程池中的异步 I/O 线程数不足,这些 I/O 操作就会阻塞等待异步 I/O 线程的空闲,而其他线程则无法得到充分利用,从而导致线程饥饿。

  3. 线程池饥饿:当程序中存在大量短时任务时,如果线程池中的工作线程数太少,这些任务就会形成队列等待执行,而其他线程也无法得到充分利用,从而导致线程饥饿。

避免线程饥饿的方法包括:

  1. 增加系统资源:增加 CPU、内存等硬件资源,以满足程序对资源的需求。

  2. 调整线程池参数:根据实际情况调整线程池中工作线程数和异步 I/O 线程数等参数,以提高系统的并发处理能力。

  3. 使用异步编程模型:通过使用异步编程模型和异步 I/O 操作,可以避免阻塞和等待,从而提高程序的并发性和响应能力。

  4. 优化代码逻辑:通过优化代码逻辑和算法,尽可能减少单个线程占用资源的时间和数量,从而提高整个程序的吞吐量和性能。

标签:异步,性能,程序,池中,饥饿,线程,CPU
From: https://www.cnblogs.com/lgxlsm/p/17444276.html

相关文章

  • python获取threading多线程的return返回值
    转载:(15条消息)python获取threading多线程的return返回值_pythonthreading返回值_星火燎愿的博客-CSDN博客我们正常使用threading模块创建的线程是无法获取它所执行方法的返回值的;如:w=threading.Thread(target=worker,args=(i,))一、重写线程,获取线程return返回值要想获......
  • Linux网络性能评估工具iperf 、CHARIOT测试网络吞吐量
    网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保证网络性能的基础,但是由于网络设计不合理、网络存在安全漏洞等原因,都会导致网络带宽利用率不高。要找到网络带宽利用率不高的原因,就需要对网络传输进行监控,此时就需要用到一些网络性能评估工具,而Iperf就是这样一款......
  • 【Gatling】性能测试工具的安装与负载测试
    一、官网https://gatling.io/open-source/ 二、安装JDK资料太多了,不写了https://jingyan.baidu.com/article/48b558e3f135687f38c09a03.html 三、安装Gatling 下载完解压,配置下环境变量Path即可 四、使用简单使用可以参考第一个链接  参考链接:什么是Gatling......
  • 多线程-线程池与java内存模型
    多线程-线程池与java内存模型线程池的使用(思路:什么是线程池->他的基本构造以及参数含义->如何使用,使用过程中需要注意什么->有哪些好用的工具类)线程池的基笨概念:首先看一下的继承关系,其次看他的状态,它是利用int的高三位表示状态,比如111表示能接受任务,具体看下面第二章图......
  • JS大文件分片上传/多线程上传
    ​ 一、概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需要自己实现。 二、Range  用于请求头......
  • redis是单线程还是多线程?为什么redis那么快?
    redis是单线程的。官方表示,Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!Redis为什么单线程还这么快?1、误区1:高性能的服务器一定是多线程的?2、误区2:多线程一定比单线程效率高?多线程需要cpu调......
  • 多线程或监听器@Autowired注入null空指针
    //问题:在多线程中使用@Autowired注入IUserService时,userService使用时为null,获取不到bean//原因:newthread不在spring容器中,也就无法获得spring中的bean对象;@AutowiredprivateIUserServiceuserService;//解决:手动获取bean对象privateIUserServiceuserService=AppCo......
  • 用POSIX线程库创建带优先级的线程
    #include<iostream>#include<pthread.h>void*threadFunction(void*arg){//线程函数逻辑//...returnnullptr;}intmain(){pthread_tthread;pthread_attr_tattr;//初始化线程属性pthread_attr_init(&attr);//......
  • Java大文件分片上传/多线程上传功能
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......
  • 我将性能提升了百分之20 —— 一次系统延迟优化案例
    一次系统延迟优化案例问题背景线上隔三差五晚上10点左右总会有sql报警出现,且是同样的sql,我们的sql报警是在应用程序内部通过对sql操作增加钩子函数,对sql前后执行的位置记录下时间戳,然后sql执行完毕后,对时间戳进行相减得到sql执行时长,大于1s则报警。晚上10点正好是我们的业务高峰......