提高线程数,解决redis超时问题
根据压测结果做出的修改历史:
第一步:只针对maxWorkerThreads、maxIoThreads和minWorkerThreads做了修改<processModel autoConfig="false" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" />,发现并无明显性能提升。
第二步:针对第一步,提高了三个参数的值maxWorkerThreads="200" maxIoThreads="200" minWorkerThreads="100" 。并且修改了“每个处理器的线程数限制”,从默认值25提高到50,顺便修改了队列长度从3000到30000。此时,性能有明显提升。
第三步(未执行):修改应用程序池的“最大工作进程数”,即使用IIS的Web Garden功能(多工作进程模式)。
总结:一开始只是提高了IIS的最大、最小线程数,但是由于ASP的每个处理器的线程数限制(25),所以性能并没有明显提升。后来提高了ASP的每个处理器的线程数限制,性能才有明显好转,但直接表现是站点进程的CPU和使用线程数明显升高,导致服务器本身负载飙升。目前这种较为粗暴的直接增大参数指标的优化方式比较适用于服务器上的单站点或者单个负载较高的站点,如果一台服务器上有几个负载加高的站点,会导致服务器本身资源损耗严重反而影响站点的处理能力,第三步的Web Garden尤为明显。所以,应该持续压测、观察来找到一个较为适合我们服务器和站点结构的参数配置。
以下参考文档是对以上参数的释义及修改方法:
1、maxWorkerThreads、maxIoThreads
ASP.NET 使用以下两个配置设置来限制工作线程和完成线程所使用的最大数目︰
配置文件:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config
修改参数: <processModel autoConfig="false" maxWorkerThreads="200" maxIoThreads="200" minWorkerThreads="100" />
MaxWorkerThreads参数和maxIoThreads参数隐式地乘以 Cpu 的数量。例如,如果您有两个处理器,是以下的最大工作线程数︰
2、minWorkerThreads
从 ASP.NET 1.0 Service Pack 3 和 ASP.NET 1.1 中,ASP.NET 还包含以下确定多少工作线程可能会使可立即用于远程请求提供服务的配置设置。
<processModel minWorkerThreads="1">
此设置控制的线程可以在更快的速度比从 CLR 的默认"线程优化"功能创建的辅助线程创建。可能突然填充 ASP.NET 请求队列的后端服务器上的 slow-down 由于此设置启用 ASP.NET 服务请求、 请求来自客户端,或其它类似突然爆发,会导致在队列中的请求数量突然上升。MinWorkerThreads参数的默认值为 1。我们建议您将minWorkerThreads参数的值设置为下面的值。
minWorkerThreads = maxWorkerThreads / 2
默认情况下,不存在 Web.config 文件或 Machine.config 文件中的minWorkerThreads参数。此设置隐式乘以
3、优化每个处理器限制对线程 ASP 属性的值(默认25,已修改成50)
ASP处理器限制每个线程属性指定的最大工作线程为每个 IIS 创建的处理器数。 之前的处理器使用率满足至少 50%或更高版本,应增加处理器限制每个线程的值。 此设置可能大大会影响 Web 应用程序的可伸缩性和服务器的性能通常。 因为此属性定义的最大可以同时执行的 ASP 请求数,此设置应保持为默认值,除非你 ASP 应用程序进行扩展的外部组件调用。 在这种情况下,可能会增加处理器限制每个线程的值。 这样做将使要创建更多的线程,以处理更多的并发请求的服务器。 处理器限制每个线程的默认值为 25。 此属性的最大建议的值为 100。
若要增加处理器限制每个线程的值,请执行以下步骤: 在连接窗格中,选择 web 服务器,请单击以选中功能视图,然后双击ASP功能。
单击启动,指向所有程序,单击管理工具,然后单击Internet Information Services (IIS) Manager.
在连接窗格中,选择 web 服务器,请单击以选中功能视图,然后双击ASP功能。
单击以展开限制属性下行为,单击处理器限制每个线程,输入所需的值线程每个处理器限制单击应用中操作窗格。
4、优化 ASP 队列长度属性的值(默认3000,已修改成30000)
优化此属性的目标是确保良好的响应时间,同时最小化 ASP 请求队列已满时,服务器频率发送到客户端的 HTTP 503 (服务器太忙) 错误。 如果 ASP 队列长度属性的值太低,则服务器将使用更高的频率发送 HTTP 503 错误。 如果 ASP 队列长度属性的值过高,所以用户可能会认为,服务器没有响应时实际上他们的请求正在等待队列中。 通过在高流量期间观看队列,你应识别 web 请求高峰和低谷的模式。 记下的峰值值,并设置正上方的峰值值 ASP 队列长度属性的值。 使用队列以处理短期峰值,请确保响应时间,并限制系统,从而避免重载时持续,出现意外的峰值。 如果你没有用于调整 ASP 队列长度属性的数据,将是很好的起点将队列一对一比率设置为线程的总数。 例如,如果每个处理器限制对线程 ASP 属性设为 25,具有四个处理器 (4 * 25 = 100 线程),将 ASP 队列长度属性设置为 100 并从该处优化。
若要增加队列长度的值属性,请按照下列步骤:
单击启动,指向所有程序,单击管理工具,然后单击Internet Information Services (IIS) Manager.
在连接窗格中,选择 Web 服务器,请单击以选中功能视图,然后双击ASP功能。
单击以展开限制属性下行为,单击队列长度,输入所需的值队列长度,然后单击应用中操作窗格
5、Web Garden
IIS默认配置下采用的是单工作进程的工作模式,也就是只启用一个w3wp.exe进程处理所有请求,然后进程内启用多个线程来处理并发请求,最大工作线程数由具体的操作系统和IIS来决定,当并发量大于线程数时则会让请求排队等待处理。这是面对高并发量,且部分请求处理耗时较长时就会造成大部分请求长期处于挂起的状态,直接反应就是慢或者超时。
提高线程数,解决redis超时问题的更多相关文章
- [转]IIS7.5优化--提高线程数来适应高并发
根据压测结果做出的修改历史: 第一步:只针对maxWorkerThreads.maxIoThreads和minWorkerThreads做了修改<processModel autoConfig= ...
- 一个使用高并发高线程数 Server 使用异步数据库客户端造成的超时问题
现象 今天在做一个项目时, 将 tomcat 的 maxThreads 加大, 加到了 1024, tomcat 提供的服务主要是做一些运算, 然后插入 redis, 查询 redis, 最后将任务返 ...
- [转载]C# 多线程、控制线程数提高循环输出效率
C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段 ...
- 通过设置线程池的最小线程数来提高task的效率,SetMinThreads。
http://www.cnblogs.com/Charltsing/p/taskpoolthread.html task默认对线程的调度是逐步增加的,连续多次运行并发线程,会提高占用的线程数,而等若干 ...
- 解决Redis/Codis Connection with master lost(复制超时)问题
今天在线上环境中遇到了codis-server报警,按照常规处理流程进行处理,报错步骤如下: 首先将codis-slave的rdb文件移除,并重启codis-slave 在codis-dashbord ...
- C# 多线程、控制线程数提高循环输出效率
C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段 ...
- web容器线程数和程序中线程阻塞导致 请求超时
问题描述: web项目启动之后.调用dubbo的远程服务. 但是有个基础服务报错. 当并发访问用户量上来之后. dubbo服务的报错返回 比正常服务慢 不能正常消费服务 清理服务线程. 也就是dubb ...
- 转载:IIS 之 连接数、并发连接数、最大并发工作线程数、队列长度、最大工作进程数
一.IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫“IIS限制连接数”. 客户请求的连接内容包括: [ ...
- IIS 之 连接数、并发连接数、最大并发工作线程数、队列长度、最大工作进程数
一.IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫“IIS限制连接数”. 客户请求的连接内容包括: [ ...
随机推荐
- Idea的类中使用实体类(有@Data注解)的Get/Set方法报错
今天从svn上面下了一个maven项目,导入到Idea中之后,发现有的类会使用实体类的Set/Get方法(全报错),导致该问题的原因就是因为实体类中没有这个方法,代码类似如下: @Data publi ...
- VS2019企业版产品密钥
Visual Studio 2019 Enterprise产品密钥(激活码) BF8Y8-GN2QH-T84XB-QVY3B-RC4DF
- DLL对应的导入库一定会生成的
测试代码: #pragma once #define TESTDEPEND_EXPORTS #ifdef TESTDEPEND_EXPORTS #define TESTDEPEND_API __dec ...
- 【转帖】使用容器化和 Docker 实现 DevOps 的基础知识
使用容器化和 Docker 实现 DevOps 的基础知识 https://www.kubernetes.org.cn/6730.html 2020-02-24 15:20 灵雀云 分类:容器 阅读( ...
- android stutio 添加依赖
添加依赖有 3种方法: 1 :copy jar 包到libs目录 ,add to library 2: copy aar 文件到libs ,gradle 文件 android 节点添加 repo ...
- CodeForces-1100C NN and the Optical Illusion 简单数学
题目链接:https://vjudge.net/problem/CodeForces-1100C 题意: 题目给出外部圆的数目n和内部圆的半径r,要求求出外部圆的半径以满足图片要求. 显然这是一道数学 ...
- 数据处理pandas
1.缺失值时间戳不为NaN,为NaT, 同样判断都为isna()或notna()方法2.删值\去重 df.dropna() df.drop_duplicates() 3.上下值插值 df.fillna ...
- 完整注册登陆php源码,附带session验证。
1.首先先写表单页面login.html. <!DOCTYPE html> <html lang="en"> <head> <me ...
- array_flip() 函数返回一个反转后的数组
定义和用法 array_flip() 函数返回一个反转后的数组,如果同一值出现了多次,则最后一个键名将作为它的值,所有其他的键名都将丢失. 如果原数组中的值的数据类型不是字符串或整数,函数将报错 ar ...
- 两个tomcat使用同一个jvm可能会出错
如果两个tomcat中的项目的某些类具有完全相同的包路径和类名的话,jvm可能会“弄混”这两个类,所以一般要求包名“必须”唯一. 当然,如果两个类中的代码和import的类完全一样,弄混了也就弄混了, ...