提高线程数,解决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限制连接数”. 客户请求的连接内容包括: [ ...
随机推荐
- 51nod 1392:装盒子 匈牙利+贪心
1392 装盒子 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 关注 有n个长方形盒子,第i个长度为Li,宽度为Wi,我们需要把他们套放.注意一个盒子 ...
- mybatis中#{}和${}的区别及order by的sql注入问题
mybatis的#{}和${}的区别以及order by注入问题 原文 http://www.cnblogs.com/chyu/p/4389701.html 前言略,直奔主题.. #{}相当于j ...
- SDWebImage清理缓存
[[SDImageCache sharedImageCache] getSize]//计算缓存的大小,单位B float tmpSize = [[SDImageCache sharedImageCac ...
- MySQL--InnoDB 关键特性
插入缓冲 Insert Buffer 对于非聚集索引的插入或更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入:若不在,则先放入到一个 Insert ...
- 多线程下,两个线程交替打印0 -100,使用wait()和notify()
多线程下,两个线程交替打印0 -100,使用wait()和notify() public class ThreadTest{ private static final Object lock = ne ...
- HDU 2586 How far away ?【LCA模板题】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:给你N个点,M次询问.1~N-1行输入点与点之间的权值,之后M行输入两个点(a,b)之间的最 ...
- 用eclipse运行算法第四版的BinarySearch
import java.util.Arrays; import edu.princeton.cs.algs4.In; import edu.princeton.cs.algs4.StdIn; impo ...
- 如何在 main() 执行之前先运行其它函数
摘要:我们知道 C++ 的全局对象的构造函数会在 main 函数之前先运行,其实在 c 语言里面很早就有啦,在 gcc 中可以使用 __attribute__ 关键字指定如下(在编译器编译的时候就绝决 ...
- PAT Basic 1075 链表元素分类(25) [链表]
题目 给定⼀个单链表,请编写程序将链表元素进⾏分类排列,使得所有负值元素都排在⾮负值元素的前⾯,⽽[0, K]区间内的元素都排在⼤于K的元素前⾯.但每⼀类内部元素的顺序是不能改变的.例如:给定链表为 ...
- PAT Advanced 1074 Reversing Linked List (25) [链表]
题目 Given a constant K and a singly linked list L, you are supposed to reverse the links of every K e ...