构建高性能.NET应用之配高可用IIS服务器-第五篇 IIS常见问题之:工作进程回收机制(中)

我们在本篇中接着讲述“工作进程回收机制”。

         本篇文章的议题如下:

         工作进程回收机制讲解

基于时间的回收机制

         基于请求数的回收机制

         基于内存使用的回收机制

基于活动状态的回收机制

          

基于请求数的回收机制

这种基于请求数量回收的机制非常的好理解:当我们的应用程序收到的请求数量达到了一个阀值之后,就开始对应用程序池中的工作进程使用的资源进行回收,设置的方法和之前讲述的基于时间的基本类似,如图:

                            

其实很多的时候,引起这种回收机制的原因都是应用程序已经无法处理过多的请求,导致了请求处理失败,而不得不开始运行这种回收机制。

基于内存使用的回收机制

    应用程序池的回收是可以通过它所使用的内存来设置的,可以通过设置它已经使用的内存和它的虚拟内存两个方面来决定何时进行回收,大致的情况如下图:


我们使用基于内存的工作进程回收机制可以在一定的程度上面防止内存泄露或者内存过度分配的情况。同时,有一个需要清楚的的就是:很多的时候,我们的Web应用程序的性能在很大的程度上来依赖缓存,特别是在ASP.NET中使用它的缓存API的时候,我们要非常的清楚这些问题。缓存数据空间的大小不是无限制的,它的大小是可以配置的,并且有可能出现这样的一种情况:数据在前一秒缓存进入,下一秒在使用的时候缓存的数据就没有了,可能就会导致“找不到对象“等问题,这个时候,原因就是设置的缓存空间大小已经达到了设置值,导致了工作进程回收,使得数据全部丢掉。更多的关于这个方面的讲述,可以参看我的另外的一篇文章:使用缓存的9大误区()

    另外,设置基于内存使用的回收机制,可以让回收机制“监控“内存的时候,防止之前所说的内存泄露等情况。

    说了这么多,那么我们就来看看如何来设置基于内存的回收机制。

专用内存使用情况(Private bytes)

这个设置可以限制在一个工作进程被回收之前可以使用的专用的不共享的内存的大小。其实说到这里,估计有些朋友又开始不明白了,因为这已经涉及到了Window内存管理的一些知识,大家可以参看这篇文章:window内存管理知识普及

    注:可以说Window内存,进程调度等知识都是性能优化过程中需要掌握的基础,其实现在很多的开发人员是完全不懂这些东西,仅仅只是知道C#语法,然后使用基本的语法规程编程,如果真是这样,技术很难提升到很高的层面。

 

    在IIS6中,这个设置在应用程序“属性“的“回收“选下卡中,被称之为“最大使用的内存“,单位是Mb,如下:


    在IIS7中就称之为“专用内存”(其实也是内核模式可使用的内存数量),单位为Kb。

    这个值的设置对ASP.NET应用中的缓存和Session使用至关重要。如果这个值设置的太小,同时我们的应用程序又是非常大的依赖缓存,那么,就会导致工作进程频繁的被回收,很多的在进程中保存的数据就会丢失,后果可想而知。

    在ASP.NET2.0以后,缓存机制通过使用缓存剪裁策略来避免工作进程回收。什么意思呢?

    就是,缓存机制会根据一些策略(例如,最近最少使用算法等)来将缓存中的一些数据移除,将空闲的位置让给别的数据,从而避免缓存空间使用过大,从而避免了内存的使用太多而达到回收的阀值。我们可以在web.config中使用privateBytesLimit设置来配置缓存裁剪的级别,如下:

    下面我们就看看在默认的情况下,何时出现缓存剪裁的问题:

用户模式内存大小

<=2GB

>2GB(32位的操作系统)

>2GB(64位操作系统)

60%*物理内存或者800Mb

60%*物理内存或者800Mb

60%*物理内存或者1TB

    上面的表格比较简单,我这里只是稍微的讲述一下(以用户模式内存小于2GB为例子):如果操作系统中进程的用户模式的内存小于2GB,那么privateBytesLimit的值就会是:60%*物理内存(例如,我们配置的内存条的大小为4GB),如果配置的物理内存条的大小实太小了,例如1GB,那么此时60%*1GB=600Mb,此时privateBytesLimit就不会按照这个来设置值,而是直接取800Mb。

    同时,除了设置privateBytesLimit的固定值之外,我们还可以按照比例来设置,使用percentagePhysicalMemoryUsedLimit来设置当内存使用多少之后就开始对缓存进程裁剪,这是一个动态的过程,它可以自行计算。另外,这个值也可以有效的减少.NET垃圾回收机制的运行,提升性能。

   

虚拟内存使用情况(Virtual bytes)

    在这里,我就没有必要介绍虚拟内存的概念了。关于虚拟内存的问题也是非常的难以诊断和发现的,虚拟内存的问题主要就是碎片的问题。

    当进程在运行的时候,它是由一个最大的虚拟内存大小的,例如,在Win32的操作系统中,就是4GB,用户模式与内核模式各是2GB(在没有使用/3GP的情况下)。当进程中的程序需要内存的时候,虚拟内存管理器会去分配一个空间,久而久之就可能导致虚拟内存产生很多的碎片,导致后续的内存分配无法进行,而产生”Out Of Memory”的问题。

    其实,我们也没用非常好的办法来避免这个问题,但是可以通过一些经验来缓解,例如,我们可以设置当虚拟内存空间使用了70%的时候就启动回收,同时,我们也可以通过监视Process/VirtualBytes这个性能计速器来分析数据。


相关内容

  • 构建高性能.NET应用之配置高可用IIS服务器-第一篇:IIS必须掌握的知识

  • 构建高性能.NET应用之配置高可用IIS服务器-第二篇 IIS请求处理模型

  • 构建高性能.NET应用之配置高可用IIS服务器-第三篇 IIS中三个核心组件的讲解(上)

  • 构建高性能.NET应用之配置高可用IIS服务器-第四篇 IIS常见问题之:工作进程回收机制(上)


作者介绍:汪洋,哪合伙CEO,曾大汉电子商务有限公司首席技术官,副总裁,负责公司产品、技术、运营,参与商业模式设计。华康移动医疗前CTO,副总裁,首席架构师。微软MVP



.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10.netty客户端与服务器使用protobuf传输报文

【README】 本文总结自B站《尚硅谷-netty》&#xff0c;很不错&#xff1b; 内容如下&#xff1a; netty的编码器与解码器&#xff1b;netty客户端与服务器通过 protobuf 传输报文的开发方式&#xff1b;文末po出了所有代码&#xff1b;【1】netty的编码器与解码器 codec 1&…

Oracle入门(十四.5)之识别数据类型

一、PL / SQL数据类型 数据类型指定存储格式&#xff0c;约束和有效的值范围。 PL / SQL支持五类数据类型&#xff1a;二、标量数据类型&#xff08;Scalar&#xff09; &#xff08;1&#xff09;标量数据类型•保持一个值 •没有内部组件 •可以分为四类&#xff1a; - 性格…

TFS2015的CI集成

这篇应该是这个系列的最后一篇了 配置生成代理 配置dotnet cli环境 这步&#xff0c;需要在生成代理的机器上配置cli环境&#xff0c;与本地配置方法一致&#xff0c;可以自行Google 下载及参考地址&#xff1a; https://www.microsoft.com/net/core#windows 配置环境变量 在生…

pivot sqlserver 条件_行转列之SQLSERVERPIVOT与用法详解

在数据库操作中&#xff0c;有些时候我们遇到需要实现“行转列”的需求&#xff0c;例如一下的表为某店铺的一周收入情况表&#xff1a;WEEK_INCOME(WEEK VARCHAR(10),INCOME DECIMAL)我们先插入一些模拟数据&#xff1a;INSERT INTO WEEK_INCOMESELECT 星期一,1000UNION ALLSE…

Oracle入门(十四.6)之使用标量数据类型

一、声明字符变量 字符数据类型包括CHAR&#xff0c;VARCHAR2和LONG。 DECLAREv_emp_job VARCHAR2(9);v_order_no VARCHAR2(6);v_product_id VARCHAR2(10);v_rpt_body_part LONG; …二、声明数字变量 数字数据类型包括NUMBER&#xff0c;PLS_INTEGER&#xff0c;BINARY_INTEGER…

11.netty入站与出站(处理器链调用机制)

【README】 1.本文源代码总结自 B站《netty-尚硅谷》&#xff1b;2.本文部分内容总结自 https://www.baeldung.com/netty3.本文主要介绍了通道管道中多个入栈处理器与多个出站处理器如何执行&#xff1f;并用代码演示执行顺序&#xff1b; 补充&#xff1a;文末附带了 log4j整…

1688推广工具_全面了解1688数字营销

全面了解1688数字营销什么是数字营销&#xff1f;在数字营销中&#xff0c;有一款很重要的工具-一键推广。在我们的日常经营和大促中&#xff0c;通过一键站外推广可以在各大站外平台实现全店、各产品的推广&#xff0c;尤其在大促中&#xff0c;结合活动当天的站内流量&#x…

Entity Framework升级

第三篇是Entity Framework升级 修改project.json 把原来 EntityFramework 的包 换成 Microsoft.EntityFrameworkCore 版本从 7.0.0-rc1-final 改为 1.0.0-rc2-final 对照表如下&#xff1a; RC1 PackageRC2 EquivalentEntityFramework.MicrosoftSqlServer 7.0.0-rc1-finalMicro…

12.netty中tcp粘包拆包问题及解决方法

【README】 1.本文源代码总结自B站《netty-尚硅谷》&#xff1b;2.本文介绍了tcp粘包拆包问题&#xff1b;3.本文po 出了粘包拆包问题解决方案及源代码实现&#xff1b;【1】tcp粘包拆包问题 refer2 How to deal with the problem of packet sticking and unpacking during T…

Oracle入门(十四.7)之良好的编程习惯

一、目的良好的编程实践是可以遵循的技术来创建最佳代码。 编程实践涵盖了从编写更易读的代码到创建具有更快性能的代码。软件工程团队通常会遵循风格指南&#xff0c;以便团队中的每个人都使用相同的技术。 这使得读取和修改其他人编写的代码变得更加容易。二、编程实践您已经…

css 浏览器调试中不可见_前端入门必会的初级调试技巧

本文仅仅针对前端初学者&#xff0c;目的是【用20%不到的时间】 学会【前端最常用的部分调试技巧】&#xff0c;如果需要最详细的调试技巧&#xff0c;包括调试性能优化的相关知识&#xff0c;文末会补充最全的文档&#xff08;chrome devtool的官方文档链接&#xff09;初学一…

升级ASP.Net Core项目

升级完类库项目&#xff0c;第二篇&#xff0c;我们来升级ASP.Net Core项目 修改global.json与project.json 这里可以参照&#xff0c;升级.Net Core RC2的那些事&#xff08;一&#xff09; 这里补充一点就是如果你觉得这样修改复杂&#xff0c;你完全可以新建一个项目&#x…

gophp解释器_【干货】Gisp 解释器 Golang 辅助开发工具

Gisp 是一个提供给 golang 使用的 Lisp 类 DSL 解释器。在 Lisp 的基本语法基础上&#xff0c;针对 go 环境稍作了一点语法糖。主要目标是提供一个尽可能便于与 golang 互操作的微型DSL工具。简介Gisp用go语言编写&#xff0c;是一个DSL 解释器&#xff0c;这个 DSL 基本上就是…

Oracle入门(十四.8)之迭代控制:基本循环Loop

一、迭代控制&#xff1a;LOOP语句 循环多次重复一个语句或一系列语句。 PL / SQL提供了以下几种类型的循环&#xff1a;•没有全面条件执行重复操作的基本循环 •FOR循环&#xff0c;基于计数器执行迭代操作•WHILE循环根据条件执行重复操作二、基本循环LOOP语句的最简单形式…

phpst安装memcache扩展_在 Ubuntu/Debian 下安装 PHP7.3 教程

介绍最近的 PHP 7.3.0 已经在 2018 年12月6日 发布 GA&#xff0c;大家已经可以开始第一时间体验新版本了&#xff0c;这里先放出 PHP7.3 安装的教程以便大家升级。适用系统&#xff1a; Ubuntu 18.04 LTS / Ubuntu 16.04 LTS &#xff0f; Ubuntu 14.04 LTS / Debian 9 stretc…

升级.Net Core RC1的类库项目

微软终于发布了.Net Code RC2了&#xff0c;作为一个软粉当然是第一时间升级了。《升级.Net Core RC2的那些事》系列文章主要是记录本人升级RC2的相关步骤以及遇到过的坑。 第一篇先写类库项目&#xff08;Nuget包项目&#xff09;的升级 升级VS工具 这里只提供一个下载地址&am…

Oracle入门(十四.9)之迭代控制:WHILE和FOR循环

一、WHILE循环您可以使用WHILE循环重复一系列语句&#xff0c;直到控制条件不再为TRUE。 条件在每次迭代开始时进行评估。当条件为FALSE或NULL时&#xff0c;循环终止。 如果条件在循环开始时为FALSE或NULL&#xff0c;则不会执行进一步的迭代。 WHILE condition LOOPstatement…

为TFS配置跨平台的生成服务器Xplat (Ubuntu Linux)

1. 概述 从TFS 2015开始&#xff0c;微软开始支持跨平台的构建代理。你可以使用TFS的Xplat代理&#xff0c;方便的在基于IOS, Unix和Linux的服务器上搭建生成代理&#xff0c;实现构建、发布等功能。本文档已Ubuntu为例&#xff0c;指导如何安装和运行Xplat代理。 2. 配置TFS的…

分数优先遵循志愿php源码_分数优先 遵循志愿

本报讯 昨日&#xff0c;广东省考试院发布2019年我省普通高校招生平行志愿投档及录取实施办法。今年我省依旧实行普通高校招生平行志愿投档录取模式&#xff0c;按照“分数优先、遵循志愿”的原则&#xff0c;根据考生高考成绩高低排序和院校志愿先后顺序投档&#xff0c;投出…

Oracle入门(十四.10)之显式游标简介

一、上下文区域和游标Oracle服务器分配一个称为上下文区域的私有内存区域来存储由SQL语句处理的数据。 每个上下文区域&#xff08;因此每个SQL语句&#xff09;都有一个与其关联的游标。您可以将游标视为上下文区域的标签&#xff0c;或者将其作为指向上下文区域的指针。 事实…