精华内容
下载资源
问答
  • 水环境容量计算软件

    2019-04-11 09:21:16
    水质和水环境容量计算软件是一款易用简单的水质和水环境计算软件,拥有水平年计算、二维水质计算、一维水体纳污能力计算、一维水体纳污能力计算、水质降解系数计算、水质降解系数等多种功能,非常适合水质和水环境...
  • 海康威视录像容量计算工具(含用户使用手册) 一般130万摄像头全天24小时录像的容量大约是21G,200万摄像头全天24小时的录像容量大约是42G,依次类推。H.265的到来,录像容量计算就有新规则啦!详细请下载工具查看。
  • NASA锂电池容量提取

    2018-11-29 11:09:26
    附详细注释,针对NASA电池数据,该程序用于提取容量
  • 查看电脑电池真实容量的命令查看电脑电池真实容量的命令查看电脑电池真实容量的命令查看电脑电池真实容量的命令
  • 规划环境影响评价中大气环境容量计算
  • 此MATLAB程序采用矩阵表述的迭代算法求解离散单符号信道的信道容量。《信息论》课程上机作业之一。
  • 监控视频容量计算器

    2015-09-03 15:09:08
    监控视频容量计算器,计算监控镜头数量涉及的容量,使用如何的存储格式,能够存储多少天,用起来还是挺方便,做报告的时候提供较准确的技术指标
  • MIMO信道分析,MIMO信道容量计算,对分集和复用原理介绍,以及其信道容量的计算
  • MIMO信道容量仿真matlab代码,最全的M文件
  • 例子主要包括SocketAsyncEventArgs通讯封装、服务端实现日志查看、SCOKET列表、上传、下载、远程文件流、吞吐量协议,用于测试SocketAsyncEventArgs的性能和压力,最大连接数支持65535个长连接,最高命令交互速度...
  • 考虑自平衡能力的并网型微电网多目标容量优化设计nsga2算法matlab实现
  • MIMO信道容量 matlab

    2013-07-04 16:21:53
    用于MIMO信道容量计算的matlab代码,很好用。
  • 花了一天写的MATLAB遗传算法,解决多车有容量约束VRP问题,运行成功。花了一天写的MATLAB遗传算法,解决多车有容量约束VRP问题,运行成功。花了一天写的MATLAB遗传算法,解决多车有容量约束VRP问题,运行成功。
  • 为啥HashMap的默认容量是16?

    万次阅读 多人点赞 2019-12-09 09:39:30
    通过前面的例子,我们发现了,当我们创建一个HashMap的时候,如果没有指定其容量,那么会得到一个默认容量为16的Map,那么,这个容量是怎么来的呢?又为什么是这个数字呢? 容量与哈希 要想讲清楚这个默认容量的...

    集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生。

    在日常开发中,我们经常会像如下方式以下创建一个HashMap:

    Map<String, String> map = new HashMap<String, String>();
    

    但是,大家有没有想过,上面的代码中,我们并没有给HashMap指定容量,那么,这时候一个新创建的HashMap的默认容量是多少呢?为什么呢?

    本文就来分析下这个问题。

    什么是容量

    在Java中,保存数据有两种比较简单的数据结构:数组和链表。数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。HashMap就是将数组和链表组合在一起,发挥了两者的优势,我们可以将其理解为链表的数组。

    在HashMap中,有两个比较容易混淆的关键字段:size和capacity ,这其中capacity就是Map的容量,而size我们称之为Map中的元素个数。

    简单打个比方你就更容易理解了:HashMap就是一个“桶”,那么容量(capacity)就是这个桶当前最多可以装多少元素,而元素个数(size)表示这个桶已经装了多少元素。

    -w778

    如以下代码:

    Map<String, String> map = new HashMap<String, String>();
    map.put("hollis", "hollischuang");
    
    Class<?> mapType = map.getClass();
    Method capacity = mapType.getDeclaredMethod("capacity");
    capacity.setAccessible(true);
    System.out.println("capacity : "   capacity.invoke(map));
    
    Field size = mapType.getDeclaredField("size");
    size.setAccessible(true);
    System.out.println("size : "   size.get(map));
    

    输出结果:

    capacity : 16、size : 1
    

    上面我们定义了一个新的HashMap,并想其中put了一个元素,然后通过反射的方式打印capacity和size,其容量是16,已经存放的元素个数是1。

    通过前面的例子,我们发现了,当我们创建一个HashMap的时候,如果没有指定其容量,那么会得到一个默认容量为16的Map,那么,这个容量是怎么来的呢?又为什么是这个数字呢?

    容量与哈希

    要想讲清楚这个默认容量的缘由,我们要首先要知道这个容量有什么用?

    我们知道,容量就是一个HashMap中"桶"的个数,那么,当我们想要往一个HashMap中put一个元素的时候,需要通过一定的算法计算出应该把他放到哪个桶中,这个过程就叫做哈希(hash),对应的就是HashMap中的hash方法。

    -w688

    我们知道,hash方法的功能是根据Key来定位这个K-V在链表数组中的位置的。也就是hash方法的输入应该是个Object类型的Key,输出应该是个int类型的数组下标。如果让你设计这个方法,你会怎么做?

    其实简单,我们只要调用Object对象的hashCode()方法,该方法会返回一个整数,然后用这个数对HashMap的容量进行取模就行了。

    如果真的是这么简单的话,那HashMap的容量设置就会简单很多了,但是考虑到效率等问题,HashMap的hash方法实现还是有一定的复杂的。

    hash的实现

    接下来就介绍下HashMap中hash方法的实现原理。(下面部分内容参考自我的文章:全网把Map中的hash()分析的最透彻的文章,别无二家 。PS:网上的关于HashMap的hash方法的分析的文章,很多都是在我这篇文章的基础上"衍生"过来的。)

    具体实现上,由两个方法int hash(Object k)和int indexFor(int h, int length)来实现。

    hash :该方法主要是将Object转换成一个整型。

    indexFor :该方法主要是将hash生成的整型转换成链表数组中的下标。

    为了聚焦本文的重点,我们只来看一下indexFor方法。我们先来看下Java 7(Java8中虽然没有这样一个单独的方法,但是查询下标的算法也是和Java 7一样的)中该实现细节:

    static int indexFor(int h, int length) {
        return h & (length-1);
    }
    

    indexFor方法其实主要是将hashcode换成链表数组中的下标。其中的两个参数h表示元素的hashcode值,length表示HashMap的容量。那么return h & (length-1) 是什么意思呢?

    其实,他就是取模。Java之所有使用位运算(&)来代替取模运算(%),最主要的考虑就是效率。

    位运算(&)效率要比代替取模运算(%)高很多,主要原因是位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。

    那么,为什么可以使用位运算(&)来实现取模运算(%)呢?这实现的原理如下:

    X % 2^n = X & (2^n – 1)
    

    假设n为3,则2^3 = 8,表示成2进制就是1000。2^3 -1 = 7 ,即0111。

    此时X & (2^3 – 1) 就相当于取X的2进制的最后三位数。

    从2进制角度来看,X / 8相当于 X >> 3,即把X右移3位,此时得到了X / 8的商,而被移掉的部分(后三位),则是X % 8,也就是余数。

    上面的解释不知道你有没有看懂,没看懂的话其实也没关系,你只需要记住这个技巧就可以了。或者你可以找几个例子试一下。

    6 % 8 = 6 ,6 & 7 = 6
    
    10 % 8 = 2 ,10 & 7 = 2
    

    所以,return h & (length-1);只要保证length的长度是2^n 的话,就可以实现取模运算了。

    所以,因为位运算直接对内存数据进行操作,不需要转成十进制,所以位运算要比取模运算的效率更高,所以HashMap在计算元素要存放在数组中的index的时候,使用位运算代替了取模运算。之所以可以做等价代替,前提是要求HashMap的容量一定要是2^n

    那么,既然是2^n ,为啥一定要是16呢?为什么不能是4、8或者32呢?

    关于这个默认容量的选择,JDK并没有给出官方解释,笔者也没有在网上找到关于这个任何有价值的资料。(如果哪位有相关的权威资料或者想法,可以留言交流)

    根据作者的推断,这应该就是个经验值(Experience Value),既然一定要设置一个默认的2^n 作为初始值,那么就需要在效率和内存使用上做一个权衡。这个值既不能太小,也不能太大。

    太小了就有可能频繁发生扩容,影响效率。太大了又浪费空间,不划算。

    所以,16就作为一个经验值被采用了。

    在JDK 8中,关于默认容量的定义为:static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 ,其故意把16写成1<<4,就是提醒开发者,这个地方要是2的幂。值得玩味的是:注释中的 aka 16 也是1.8中新增的,

    那么,接下来我们再来谈谈,HashMap是如何保证其容量一定可以是2^n 的呢?如果用户自己设置了的话又会怎么样呢?

    关于这部分,HashMap在两个可能改变其容量的地方都做了兼容处理,分别是指定容量初始化时以及扩容时。

    指定容量初始化

    当我们通过HashMap(int initialCapacity)设置初始容量的时候,HashMap并不一定会直接采用我们传入的数值,而是经过计算,得到一个新值,目的是提高hash的效率。(1->1、3->4、7->8、9->16)

    在JDK 1.7和JDK 1.8中,HashMap初始化这个容量的时机不同。JDK 1.8中,在调用HashMap的构造函数定义HashMap的时候,就会进行容量的设定。而在JDK 1.7中,要等到第一次put操作时才进行这一操作。

    看一下JDK是如何找到比传入的指定值大的第一个2的幂的:

    int n = cap - 1;
    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n   1;
    

    上面的算法目的挺简单,就是:根据用户传入的容量值(代码中的cap),通过计算,得到第一个比他大的2的幂并返回。

    请关注上面的几个例子中,蓝色字体部分的变化情况,或许你会发现些规律。5->8、9->16、19->32、37->64都是主要经过了两个阶段。

    Step 1,5->7

    Step 2,7->8

    Step 1,9->15

    Step 2,15->16

    Step 1,19->31

    Step 2,31->32

    对应到以上代码中,Step1:

    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    

    对应到以上代码中,Step2:

    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n   1;
    

    Step 2 比较简单,就是做一下极限值的判断,然后把Step 1得到的数值 1。

    Step 1 怎么理解呢?其实是对一个二进制数依次向右移位,然后与原值取或。其目的对于一个数字的二进制,从第一个不为0的位开始,把后面的所有位都设置成1。

    随便拿一个二进制数,套一遍上面的公式就发现其目的了:

    1100 1100 1100 >>>1 = 0110 0110 0110
    1100 1100 1100 | 0110 0110 0110 = 1110 1110 1110
    1110 1110 1110 >>>2 = 0011 1011 1011
    1110 1110 1110 | 0011 1011 1011 = 1111 1111 1111
    1111 1111 1111 >>>4 = 1111 1111 1111
    1111 1111 1111 | 1111 1111 1111 = 1111 1111 1111
    

    通过几次无符号右移和按位或运算,我们把1100 1100 1100转换成了1111 1111 1111 ,再把1111 1111 1111加1,就得到了1 0000 0000 0000,这就是大于1100 1100 1100的第一个2的幂。

    好了,我们现在解释清楚了Step 1和Step 2的代码。就是可以把一个数转化成第一个比他自身大的2的幂。

    但是还有一种特殊情况套用以上公式不行,这些数字就是2的幂自身。如果数字4套用公式的话。得到的会是 8,不过其实这个问题也被解决了,具体验证办法及JDK的解决方案见全网把Map中的hash()分析的最透彻的文章,别无二家,这里就不再展开了。

    总之,HashMap根据用户传入的初始化容量,利用无符号右移和按位或运算等方式计算出第一个大于该数的2的幂。

    扩容

    除了初始化的时候回指定HashMap的容量,在进行扩容的时候,其容量也可能会改变。

    HashMap有扩容机制,就是当达到扩容条件时会进行扩容。HashMap的扩容条件就是当HashMap中的元素个数(size)超过临界值(threshold)时就会自动扩容。

    在HashMap中,threshold = loadFactor * capacity。

    loadFactor是装载因子,表示HashMap满的程度,默认值为0.75f,设置成0.75有一个好处,那就是0.75正好是3/4,而capacity又是2的幂。所以,两个数的乘积都是整数。

    对于一个默认的HashMap来说,默认情况下,当其size大于12(16*0.75)时就会触发扩容。

    下面是HashMap中的扩容方法(resize)中的一段:

    if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&
                     oldCap >= DEFAULT_INITIAL_CAPACITY)
        newThr = oldThr << 1; // double threshold
    }
    

    从上面代码可以看出,扩容后的table大小变为原来的两倍,这一步执行之后,就会进行扩容后table的调整,这部分非本文重点,省略。

    可见,当HashMap中的元素个数(size)超过临界值(threshold)时就会自动扩容,扩容成原容量的2倍,即从16扩容到32、64、128 …

    所以,通过保证初始化容量均为2的幂,并且扩容时也是扩容到之前容量的2倍,所以,保证了HashMap的容量永远都是2的幂。

    总结

    HashMap作为一种数据结构,元素在put的过程中需要进行hash运算,目的是计算出该元素存放在hashMap中的具体位置。

    hash运算的过程其实就是对目标元素的Key进行hashcode,再对Map的容量进行取模,而JDK 的工程师为了提升取模的效率,使用位运算代替了取模运算,这就要求Map的容量一定得是2的幂。

    而作为默认容量,太大和太小都不合适,所以16就作为一个比较合适的经验值被采用了。

    为了保证任何情况下Map的容量都是2的幂,HashMap在两个地方都做了限制。

    首先是,如果用户制定了初始容量,那么HashMap会计算出比该数大的第一个2的幂作为初始容量。

    另外,在扩容的时候,也是进行成倍的扩容,即4变成8,8变成16。

    本文,通过分析为什么HashMap的默认容量是16,我们深入HashMap的原理,分析了下背后的原理,从代码中我们可以发现,JDK 的工程师把各种位运算运用到了极致,想尽各种办法优化效率。值得我们学习!

    在这里插入图片描述
    关于作者:Hollis,一个对Coding有着独特追求的人,现任阿里巴巴技术专家,个人技术博主,技术文章全网阅读量数千万,《程序员的三门课》联合作者。

    展开全文
  • 浅谈系统容量测试与容量规划

    千次阅读 2019-03-26 19:51:27
    在性能测试中,需要根据具体的性能需求和系统架构等情况,采用不同的测试策略,其中最常见的策略就有容量测试。 这篇博客,就来聊聊容量测试以及容量规划的一些内容。。。 一、什么是容量?如何理解? 在开始之前,...

    在性能测试中,需要根据具体的性能需求和系统架构等情况,采用不同的测试策略,其中最常见的策略就有容量测试。

    这篇博客,就来聊聊容量测试以及容量规划的一些内容。。。

    一、什么是容量?如何理解?

    在开始之前,有一点需要知道:系统的处理能力是有限的!

    1、容量定义

    所谓容量,即系统处于最大负载状态或某项指标达到所能接受的最大阈值下对请求的最大处理能力。

    2、如何理解

    ①、系统的容量(处理能力)是有限的;

    ②、容量是可度量的;

    二、如何统计容量指标?

    1、统计维度

    一般来说,可以从如下两个维度来定量系统的容量:

    维度类型 列举说明
    最大负载状态 服务器CPU使用率达到100%
    内存使用达到最大值
    磁盘IO延时超过所能接受的最大时延
    磁盘使用率超过最大限制
    网络使用率达到上限(最大吞吐量)
    最大接受阈值 每秒请求数/事务数(QPS/TPS)
    响应时间(ART/99%RT)
    事务成功率(一般要求99.99%甚至更高)
    超时/异常错误率
    配置参数,比如:最大连接数、最大线程数、JVM内存分配上限
    2、统计方法

    一般来说,常用的采集数据的方法,有以下几种方式:

    ①、埋点采集:即在系统的各个节点,根据需要添加埋点,针对性的进行数据采集;

    ②、日志/数据库:通过日志服务(比如ELK)或者运维监控(现在很流行的Devops),采集分析数据;

    ③、Agent/探针:在需要采集的节点添加Agent/探针,实时采集,数据存入时序数据库(比如influxdb),实时展示;

    3、注意事项

    ①、采集对比的数据一定要采集线上的真实数据,这样才能反映真实客观的系统压力。

    ②、容量测试环境的配置,一定要和线上保持一致(服务器数量可以不同,但配置尽可能保持一致)。

    三、容量测试

    容量测试是性能测试里的一种测试方法,它的目的就是测量系统的最大容量,为系统扩容,性能优化提供参考,节省成本投入,提高资源利用率。

    1、测试思路

    ①、根据具体的业务情况和系统架构,通过配置测试的手段,测量得到单个服务节点在对应的业务场景下最大的性能表现;

    ②、根据系统架构(集群、分布式、微服务)特点,通过启用≥2的服务节点,来得到服务节点的增加和系统性能的提升比例;

    ③、通过线上采集的系统数据,分析出过去某段时间(或某个业务)的高峰流量,然后通过计算,得到容量扩容,需要投入的实际服务数量;

    2、约束/停止条件

    在测试过程中,只要限定的某项指标达到最大可接受阈值或某项资源达到最大使用状态,即刻停止测试。

    3、选择合适的容量指标

    考虑到业务需求和系统架构的不同,在选取容量指标时一般遵循如下原则:

    ①、数据密集型:即并发请求量较大的类型,一般TPS和RT是比较关注的指标;

    ②、数据存储型:即需要存储读写的数据量较大的类型,一般吞吐量和IO是比较关注的指标;

    四、容量规划

    1、为什么需要容量规划?

    对于业务越来越复杂的商业形态,每个业务都由一系列不同的系统来提供服务,每个业务系统都部署在不同的机器上。容量规划的目的在于让每一个业务系统能够清晰地知道:

    ①、什么时候应该增加服务节点,什么时候应该减少服务节点(比如服务端接受到的流量达到什么量级)?(比如双十一,大促,秒杀)

    ②、为了双 11 、促销、秒杀、渠道拓展引流等业务需求,需要扩充到什么数量级的服务,才能即保证系统的可用性、稳定性,又能节约成本?

    2、容量规划四步走

    ①、业务流量预估阶段:通过分析历史数据以及实时的线上监控,预估未来某个时间点或者某个业务可能会有多少多少的流量冲击;

    ②、系统容量评估阶段:根据具体的业务场景,分析每个业务场景的流量配比,然后计算每个业务大概需要多少服务节点来提供可靠稳定的性能支撑;

    ③、系统容量测试阶段:通过全链路压测或者PAT/UAT环境的压测,来模拟真实的业务场景,确定每个服务节点的具体性能表现,进行针对性的调整;

    ④、流量分配调整阶段:根据压测的结果,设定限流、服务降级等系统保护措施,来预防当实际流量超过系统所能承受的最大流量时,系统无法提供服务;

    3、扩容手段

    ①、垂直扩容

    升级服务的硬件配置,让单个服务节点的容量更大,来提供更高的系统服务能力。比如:

    加大服务机器的CPU数量和内存,更换性能更好的高速缓存服务器,数据存储用NAS盘替换等。

    ②、水平扩展

    即增加服务节点的数量,让可提供服务的服务变得更多,来提升系统总体的服务能力。常见的方式有:

    服务集群:服务器的数量由1→N(但需要重点关注负载均衡);

    分布式:提供服务的节点由统一集中管理部署,分散到不同的地点;

    容器:提供更灵活的弹性扩容机制,根据具体的访问流量大小来弹性扩容或者缩容;

    4、更多参考

    关于容量规划,可以看这里:阿里巴巴全链路压测

    关于集群和分布式,看这里:分布式与集群的区别是什么?

    系统容量预估的问题,容量预估是架构师必备的技能之一。所谓,容量预估其实说白了就是,系统在down掉之前,所能承受的最大流量。这个事技术人员对于系统性能了解的重要指标。常见的容量评估包括流量、并发量、带宽、CPU,内存 ,磁盘等一系列内容。今天就来聊一聊容量预估的问题。

      

      一,几个重要参数

         QPS:每秒钟处理的请求数

          并发量: 系统同时处理的请求数
    
          响应时间:  一般取平均响应时间

         很多人经常会把并发数和QPS 混淆,理解了上面三个要素的意义之后,就能推算出它们之间的关系:QPS = 并发量 / 平均响应时间

      二,容量评估的步骤与方法

        1:预估总访问量

        如何知道总访问量?对于一个运营活动的访问量评估,或者一个系统上线后PV的评估,有什么好的方法?

        最简单的办法就是:询问业务方,询问运营同学,询问产品同学,看产品和运营对此次活动的流量预估。

        不过,业务方对于流量的预估,应该就两个指标,pv 和 用户访问数。技术人员 需要更具这两个数据,计算其他相关指标,比如 QPS 等。具体如何计算可参照我前面一篇 pv和并发 的文章。

        2:预估平均QPS

          总请求数 = 总PV * 页面衍生连接数

          平均QPS = 总请求数 / 总时间

          比如:活动落地页1小时内的总访问量是30w pv,该落地页的衍生连接数为30 ,那么落地页的平均QPS

          (30w 30) /(60 60) = 2500,

        3:预估峰值QPS

          系统容量规划时,不能只考虑平均QPS,而是要抗住高峰的QPS,如何评估峰值QPS呢?

          这个要根据实际的业务评估,通过以往的一些营销活动的 pv 等数据进行预估。一般情况,峰值QPS大概是均值QPS的3-5倍,日均QPS为1000,于是评估出峰值QPS为5000。

          不过,有一些业务例如“秒杀业务”比较难评估业务访问量,这类业务的容量评估不在此讨论。

        4:预估系统、单机极限QPS

          如何预估一个业务,一个服务器单机的极限QPS呢?

          这个性能指标,是服务器,最基本的指标之一,所以没有其他的办法,就是压力测试。通过压力测试,算出服务器的单机极限QPS 。

          在一个业务上线前,一般都需要进行压力测试(很多创业型公司,业务迭代很快的系统可能没有这一步,那就悲剧了),以APP 推送 某营销活动为例(预计 日均QPS 1000,峰值QPS 5000),业务场景可能是这样的:

          1)通过 APP 推送一个活动消息

          2)运营活动H5落地页是一个web站点

          3)H5落地页由缓存cache、数据库db中的数据拼装而成

          通过压力测试发现,web 服务器 单机只能抗住1200的QPS,cache和数据库db 能抗住并发压力,(一般来说,1%的流量到数据库,数据库120 QPS还是能轻松抗住的,cache的话QPS能抗住,需要评估cache的带宽,这里假设cache不是瓶颈),这样,我们就得到了web单机极限的QPS是1200。一般来说,生产系统不会跑满到极限的,这样容易影响服务器的寿命和性能,单机线上允许跑到QPS 1200 * 0.8 = 960 。

          扩展说一句,通过压力测试,已经知道web层是瓶颈,则可针对web 相关的做一些调整优化,以提高web 服务器 的单机QPS 。

          还有,压力测试工作中,一般是以具体业务的角度进行压力测试,关心的是某个具体业务的并发量和QPS。

        5:回答最开始那两个问题     

          需要的机器 = 峰值QPS / 单机极限 QPS

          好了,上述已经得到了峰值QPS是5000,单机极限QPS是1000,线上部署了3台服务器:

          (1)服务器能抗住么? -> 峰值5000,单机1000,线上3台,扛不住

          (2)如果扛不住,需要加多少台机器? -> 需要额外2台,提前预留1台更好,给3台保险

      三,最后

         需要注意的是,以上都是计算单个服务器或是单个集群的容量,实际生产环境是由web, 消息队列,缓存,数据库 等等一系列组成的复杂集群。在分布式系统中,任何节点出现瓶颈,都有可能导致雪崩效应,最后整个集群垮掉 (“雪崩效应”指的是系统中一个小问题会逐渐扩大,最后造成整个集群宕机)。所以,要了解规划整个平台的容量,就必须计算出每一个节点的容量。找出任何可能出现的瓶颈所在。

    转载于:https://blog.51cto.com/1348916/2369582

    展开全文
  • 应用系统容量管理

    千次阅读 2019-09-12 08:38:23
    应用系统容量管理是构建 IT 服务的重要过程,是 ITIL 框架和 ISO/IEC20000 标准中的标 准过程之一,应用系统容量体现了该应用系统的处理能力,特别是最大处理能力,对于系 统的正常运行、业务的产能规划保障、市场...


    应用系统容量管理是构建 IT 服务的重要过程,是 ITIL 框架和 ISO/IEC20000 标准中的标
    准过程之一,应用系统容量体现了该应用系统的处理能力,特别是最大处理能力,对于系
    统的正常运行、业务的产能规划保障、市场活动的冲击等都有着非常重要的意义,而随着
    目前应用复杂度和系统架构复杂度的不断增加,对于容量的判断和管理是非常困难又非常
    必要的,这是 ITSM 体系中对于系统可用性、可靠性和健壮性的集中体现,同时,容量管
    理也决定了投入成本的最优化, 随着业务地快速增长、对客户体验的关注度上升、对系统
    投入成本的管理等,都使得应用系统容量管理成为一个非常现实的需求和重要的管理目标。
    应用系统容量管理作为打基础的项目, 需要优先完成以下目标:
    1、 建立标准化的容量管理程序,从流程制度上规范各系统容量管理的目标和方法;
    2、分批次对重要应用系统进行业务容量分析, 完成关键容量指标(KCI) 的制定;
    3、结合业务产能规划,根据关键容量指标进行数据分析, 建立关键容量指标的监控
    和预警体系,为下一步进行容量模型的分析建立基础。
    一、 容量管理目标
    根据项目目标进行分解,分为管理办法发布、关键容量指标库制定以及关键容量指标
    监控三个子目标分别进行实现。
    1、 管理流程和规范制定:《业务系统容量管理办法》
    该办法需明确业务系统容量管理的范围、涉及容量管理的一系列管理过程和环节,明
    确各参与方的工作内容和职责,制定容量管理程序,主要包括以下内容:
    (1)关键容量指标的建立、修改、监控、关闭等过程,明确需求、设计、开发、投
    产、运行等过程中关键容量指标的管理职责;
    (2)业务产能规划中关键容量指标的应用过程,与业务产能管理相关办法相结合,
    明确业务产能变化、各类活动影响对于关键容量指标变化的管理过程;
    (3)明确在达到系统容量指标阀值的情况下,对系统进行优化、扩容以及业务应对
    等活动进行的规范和管理环节,明确容量变化时各系统应采取的措施;
    2、 基础数据收集及分析: 关键容量指标(KCI)梳理及入库
    分批次对重要应用系统进行业务容量分析,完成关键容量指标的制定:按照各业务系
    统(或独立业务模块),根据应用系统对整体业务的影响程度,分批次建立各系统的关键
    容量指标,并对关键容量指标进行数据采集,为监控和分析建立基础,总体上分为 6 批次
    进行:
    (1)运营类系统: 根据目前的系统分布、影响程度,结合相关各系统的建设项目,
    分批次进行实施。具体而言, 目前运营系统的关键业务指标和运行监控基本比较成熟,因
    此可直接运用目前的关键指标进行监控, 且运营系统做为业务运营的关键性系统,产能影
    响明显, 因此运营系统作为第一批关键容量指标系统纳入管理,运营类系统的容量指标重
    点是能够通过这些指标反应出系统对于业务产能的支持程度;
    (2)互联网系统: 从 2013 年开始,互联网类应用开始越来越重要,由于互联网应用
    系统具有周期短、变更频、社会影响大等特点,该批次的应用系统关键容量指标梳理作为
    年度容量管理项目的重点来进行,互联网类应用系统包括现有网站、 商城、微信等应用系
    统,互联网系统容量指标应考虑能够承受的用户访问、客户端响应速度、集中的用户访问
    程度等;
    (3) 渠道类应用系统:渠道类应用系统是与客户直接交互的通道,其容量关系到对
    外通道的稳定性,是实现客户沟通的重要手段, 对于容量的要求尤其重要, 因此需对该类
    系统尽快完成关键容量指标的梳理和监控,渠道类系统关注的容量指标主要考虑一段时间
    内该系统的交易通过量;
    (4) 其他生产类系统:其他生产类系统按计划纳入第四批、第五批进行,主要包括
    基础架构类系统、风险控制类系统和其他辅助生产类系统;
    (5) 办公类管理系统:办公类管理系统也纳入容量管理计划;
    应用系统关键容量指标的制定采用 PDCA 模式进行,即先根据最表面的业务应用场景
    为系统制定关键业务指标,再逐步深化分析影响业务指标的系统容量指标,逐步完成对该
    系统的容量数据的采集,为后期的模型建立数据基础,关键容量指标的完成标准为关键容
    量指标容量库的建立和管理状况,为系统建立容量阀值,定期发布系统容量报告。
    3、 监控管理系统建设: 关键容量指标的监控与发布
    建立重要系统关键容量指标的监控机制,应用系统关键容量指标库建立后,需要建立
    常规性的容量监控机制,否则系统容量管理无法有效落实。
    本着实用、高效的原则,经过若干软件产品的调研、评估和试用,我们觉得目前市面
    上并没有合适的软件可供试用,主要原因是:应用系统容量管理与实际的业务应用场景联
    系紧密,有其特定的要求,而一般软件产品为追求通用性,要么在功能上比较粗,为了适
    应某些场合需要进行大量的定制化开发,要么在功能上会有大量冗余,大部分功能根本不
    会用到,反而可能影响应用的效率,同时考虑到价格因素,我们觉得通过自建系统更容易
    贴合目前各系统容量管理的实际需要。
    常规性的容量监控机制,主要包括以下几个方面:
    (1)关键容量指标库数据采集:通过从各个系统或软件定期收集相应的数据,导入
    数据库,根据不同容量指标反应的容量状况,数据采集的频率有所差别,对于性能影响较
    大的数据,需要采取实时或准实时的方式进行,对于容量影响不明显的数据,则可将频率
    放宽,如天、周、月等;
    (2)实时监控页面:对于变化频繁的关键指标,以实时的方式收集数据,经过计算
    后可直接反应到界面上,提供给值班人员、监控人员进行监控,同时具备报警功能,满足
    报警策略后即进行邮件、短信等报警;
    (3)预测报告:根据运营产能规划,定期自动生成容量报告,具备一定的预测功能,
    即输入业务量预估后,自动进行容量影响分析,提供给容量管理人员进行分析,更好的对
    各类活动、扩容需求等进行数据支撑;
    二、 容量管理内容
    不同的应用系统容量管理内容不尽相同,随着系统复杂程度的上升,容量管理的复杂
    度也几何上升,系统间存在的各种联系,进一步加剧了容量管理的难度,因此,我们对应
    用系统容量进行层次划分,以便更好地进行分类、分层次、有目标的实施。
    系统容量管理代表了该系统的处理能力,即一段时间内系统能够承受或处理的最大负
    载,所谓负载,就是业务处理能力或者服务能力,不同的应用系统所表现的会因其功能不
    同而不同,比如信用卡审批系统中的审批处理量、客服中心的人工处理电话量等。 容量管
    理包括动态和静态两种类型,静态类型的容量管理一般指相对固定的容器可装载量,比如
    存储空间、数据库表空间等,这部分空间事先分配,满了就溢出,一般设定阀值,达到阀
    值即报警、处理,清理空间或扩大空间等;动态类型的容量管理则比较困难,一般指负载
    能力,造成负载能力变化的因素较多,影响的容量指标也较多,比如交易并发处理到一定
    并发量后,会占用大量 CPU 资源、 IO 资源或内存资源,造成服务器资源调节困难,互相等
    待,服务响应缓慢等,从而造成服务能力下降,如果系统没有负载控制调整的机制,就很
    容易形成容量和性能问题。
    1、应用系统容量分析
    下图为一个简单的系统架构示意,大部分的复杂系统,基本上都是在这样一个简单的
    架构上进行的扩展,我们以该架构对容量管理内容进行分析:

     


    (1) 对外服务能力:对外服务能力包括请求接入和响应返回,对于用户而言,实际
    上是一个层面,即用户发出请求后等待系统响应结果,正常情况下,服务能力体现在单个
    客户的响应速度上,即多长时间返回客户,反映在“服务响应时间”这一关键指标上,这
    个指标确定了对外服务的标准,也是对内部处理能力的要求,影响“服务响应时间”指标
    的因素主要包括:内部处理能力、对外服务接口的“最大并发”能力,期中“最大并发”
    体现了接口层面自身的服务能力,即在满足客户“服务响应时间”基础上,接口所提供的
    “最大并发”能力,这两个指标能够反应出接口部分的容量;
    (2) 内部处理能力: 内部处理能力是系统接收到服务接口端送来的请求后进行处理
    的过程,也是这个系统提供业务功能的核心,内部处理能力涉及内容较为复杂,为了满足
    对外“服务响应时间”的要求,必须低于“服务响应时间”这一数据指标,影响内部处理
    能力的因素主要包括:处理程序自身的逻辑处理速度、处理的数据量大小、数据库读写速
    度、调用其他系统接口的响应、硬件环境的处理能力(CPU、 IO);
    (3) 数据库处理能力: 大部分系统应用均和数据库相关,数据库的访问速度和并发
    能力是影响内部处理的重要因素之一,因此在容量管理中,数据库容量及性能是重要的一
    个关键指标;
    (4) 其他系统影响: 主要指其他系统提供的服务能力(响应速度、并发);
    (5) 软件产品容量:如果应用系统使用了含有 lisence(或类似)的软件产品,则会
    受许可证的限制,这部分也需要作为整体系统容量管理的内容;
    (6) 硬件网络环境影响: 硬件、网络等硬设备的处理能力,最终影响系统的处理能
    力和装载能力,主要硬件容量指标包括: CPU、内存、 IO 吞吐量、磁盘空间、存储空间、
    逻辑卷、文件系统、网络带宽、交换机背板带宽、端口数等。
    复杂的系统架构,以最短板部分的容量为系统的整体容量,如集群环境下,以该集群
    中最低容量的部件为集群整体容量进行计算。
    2、系统容量分类
    按上节分析,评估一个应用系统的整体容量需要从多方面多维度进行,由于容量管理
    是一个静态与动态结合的过程, 可分为:
    (1) 业务处理量: 反映在对外接口部分,主要评估响应时间要求内的最大并发能力,
    由于对外接口可能提供的服务是多个,按实际场景分析最大和最小容量;典型的服务接入
    如 WEB 集群、 Web service(集群)、 socket 等;服务接入后一般交后台程序进行处理,处
    理结果最终返回服务接入端,因此可以每个服务(交易)的响应时间作为容量评估的一个
    参数,其反映的是后台程序的处理能力,表现的是一段时间内的服务通过量;
    处理量相关部分容量指标:
    系统最大并发量:
    系统服务响应时间:
    ……
    (2) 业务承载量: 承载能力相对静态,表示该应用系统能够容纳的数据量,在交易
    型系统中,存量数据多少会影响服务处理的效率,进而影响处理能力,为了保障对外能力,
    存量数据必然有所限制,比如数据库中存放的历史交易信息一定不能是无限制的;大部分
    系统都有批处理,批处理大部分会读写文件或数据库,作为整体处理能力的一部分,批处
    理也需要纳入容量管理范围,允许的批处理时间窗口内,能够处理的数据量就是容量管理
    的一部分指标;
    承载量相关部分容量指标:
    最大用户数:
    数据保留周期:
    活动数量:
    账单日卡量:
    申请件停留量:
    ……
    3、 业务容量指标对应的系统性能容量参数
    无论业务承载量还是业务处理量,最终在系统上反映的,都是系统的软硬件配置、参
    数等实际对应值,从业务容量指标到系统容量指标的翻译非常困难,与各应用系统的复杂
    程度相关,主要的系统容量或性能指标包括:
    (1)网络性能及容量:带宽、网速;
    (2)网络设备:端口数、背板带宽等;
    (3)服务器:网卡、光纤卡、 CPU、内存、磁盘;
    (4)存储: IO、容量;
    (5)数据库:最大连接数、表空间;
    (6)文件系统:空间、类型;
    (7)应用服务器(APP):连接池数量、 JVM 大小、端口连接数;
    (8) Web 服务器:端口数
    (9)消息中间件(MQ):队列深度
    (10)应用程序:处理速度
    (11)批处理:作业的窗口
    ……
    三、 关键容量指标实现
    应用系统容量管理是一个循序渐进、不断优化的过程,戴明环(PDCA)的模式很容易
    应用在容量管理上:计划、实施、检查、改进。 按批次有计划进行、实施关键容量指标库
    的建设、在生产运行中检查指标库中的数据、不断地改进、优化指标库中的关键指标。
    1、管理覆盖度
    容量管理覆盖的目的是从管理上将主要系统纳入管理范围。
    现有系统或模块有 80 多个,按计划的批次进行管理的覆盖,建立容量指标库,部分
    公共性的指标(如数据库、中间件等)尽快纳入指标库管理范围, 2014 年实现 90%以上
    生产系统的容量管理覆盖。
    2、 两个层次细化指标数据
    通过两个层次进行指标的优化:
    (1)公共指标:如数据库、中间件、批处理、实时交易等,目前由专人或专门的系
    统进行管理,这部分的数据可通过已有的机制统一收集和优化;
    (2)逐个细化:分类别,按计划中的 6 个批次逐个系统进行细化,在这个过程中,
    容量管理人员需要弄清楚各个系统的物理架构、逻辑架构、数据架构,逐步深化、摸索影
    响业务容量指标的系统指标,根据已有数据进行分析,找出最关键的系统容量指标;
    3、与业务产能的结合
    业务产能、活动开展、外部活动都会对相关应用系统的容量产生影响, 要利用容量指
    标库,厘清各种活动对于系统的影响程度,提前做好应对;
    4、容量指标的监控
    容量指标库的建立,为下一步进行容量指标监控奠定基础。
    四、 系统化实现
    1、系统架构要求
    容量管理监控系统是运维管理平台的一部分,因此在架构上需符合一定的条件:
    (1)采用 B/S 架构,展示部分需采用 B/S 架构,避免客户端安装;
    (2)在设计及实现时可考虑一些新技术、新框架,模块化管理,后续增加其他模块
    时可以
    2、功能要求
    (1)展现:各系统关键容量指标、关键容量指标数据(周期)在系统中的展示,一
    段时间内的曲线和图形;
    (2)数据采集:各种数据的采集汇总,在系统后台实现数据的导入;
    (3)报表:
    (4)预测:按活动的类型,输入业务指标后,自动反映出哪些系统受影响;输入业
    务指标估算出系统指标的预测变化;
    (5)监控与报警:根据预定的策略,对关键指标进行实时分析,满足策略的条件即
    进行报警处理。
     

    展开全文
  • RAM的存储容量,以及地址线,数据线

    万次阅读 多人点赞 2018-09-22 16:14:12
    所以也就有计算存储容量的公式,容量=2^地址线数量x数据线数量 (bit) 3.在下面这个图里,这个存储矩阵是由32个16Kx1的存储单元组成(字位同时扩展法),表示为:64Kx8 图片地址 在这个存储矩阵中每行有4...

    0x01.半导体存储芯片的基本结构

    在这里插入图片描述
    (图片来自与网络,也可参考王道计算机组成原理复习指导)
    对图中的一些解释:

    1. RAM中负责存储数据的部分就是存储矩阵,光看“矩阵”两个字大家应该也能够想到,其是由大量存储单元列阵构成。
    2. 地址线:是单向输入的,用于确定数据的存储地址
    3. 片选线:用于确定哪个存储芯片被选中
    4. 数据线:是双向的,用于输入或输出数据

    0x02.存储单元、存储容量

    1. 最小的存储单元当然就是1bit了 (也就是存储 0 或 1)
    2. 如果用16K个1bit的单元组成一个更大的存储单元,其容量也就是16Kbit(也即2KB),一般把这样的存储单元写成16K x 1。这个存储单元中,其寻址范围是0~16K(2^14),所以需要14根地址线,每个地址上对应能存储的数据是1bit,因此数据线1根
    3. 所以也就有计算存储容量的公式,容量=2^地址线数量x数据线数量 (bit)
      在这里插入图片描述

    3.在下面这个图里,这个存储矩阵是由32个16Kx1的存储单元组成(字位同时扩展法),表示为:64Kx8
    在这里插入图片描述
    图片地址
    在这个存储矩阵中每行有4片,每列有8片,
    其寻址范围变为4x16K,即64K,需要地址线16根,每个地址上对应能存储的数据是8bit,因此需要数据线8根。
    当然,上面的图只是逻辑图,并不代表真实存储矩阵的分布。
    该存储矩阵容量是64Kx8bit 即64KB

    0x04.片选、字位同时扩展法

    上面的存储矩阵相当于4片16Kx8的存储单元组成。上面我说到其存储的寻址范围是64K(16位),其实不是连续的,
    而是:片0(0 ~ 16K)+片1(0 ~ 16K)+片2(0 ~ 16K)+片3(0~16K)
    那么,为了正确的寻址,就要靠片选了。我们把高2位作为片选地址,用于选片,通过2/4译码器来选片。
    00---->片0
    01---->片1
    02---->片2
    03---->片3
    低14位就用于片内寻址
    可以参考王道计算机组成原理复习指导中8片16Kx4位的芯片组成64Kx8位的存储器的字位同时扩展法的图:
    在这里插入图片描述

    展开全文
  • 在视频监控应用中,用于计算监控存储容量计算工具
  • 信道容量的仿真代码

    2011-11-14 11:42:34
    此matlab代码包括对QPSK, 16PSK等M-PSK和QAM, 16QAM, 32QAM, 64QAM, 128QAM等M-QAM调制方式的蒙特卡罗法仿真和与理论结果的对比,画出了星座图,Eb/N0,Es/N0为横坐标时的信道容量曲线。
  • HashMap容量解析

    千次阅读 2018-11-20 17:18:34
    HashMap中有一个有参的构造方法,传递的参数是map初始化的容量。那么给定的参数,HashMap就一定给分配参数对应的容量吗?比如,我传7进去,HashMap就会给分配7个空间吗 ? 答案是:否 因为 HashMap分配的容量可能...
  • MIMO的信道容量以及实现

    千次阅读 多人点赞 2019-09-28 14:39:25
    信道容量 所谓信道容量,是指信道能无差错的传输信息的最大信息速率,从信息论的角度,信道容量定义为: C=max⁡f(x) I(x,y)C=\underset{f(x)}{\mathop{\max }}\,I(x,y)C=f(x)max​I(x,y)     ...
  • 背板容量指的是背板整个的交换容量,交换容量指cpu的交换容量,包转发指的是三层转发的容量 一、交换机背板带宽 含义  交换机的背板带宽,是交换机接口处理器或接口卡和数据总线间所能吞吐的最大数据量。背板带宽...
  • DynamoDB 写入读取容量

    千次阅读 2018-06-20 18:19:28
    DynamoDB 是依据读取容量 写入容量和数据存储大小(表和索引)收费。这个读取容量写入容量就很恐怖了。 所以这里非常有必要了解下读取容量和写入容量。天天读AWS的文档人都不好了。 官方文档:...
  • matlab编写信道容量

    2010-05-16 14:02:42
    用MATLAB编写信道容量程序%信道容量C计算的Matlab程序 clc;clear all; N = input('输入信源符号X的个数N='); M = input('输出信源符号Y的个数M='); p_yx=zeros(N,M); %程序设计需要信道矩阵初始化为零 fprintf('...
  • 图4 商业化磷酸铁锂电池和三元电池模块的放电曲线 图4(a)和图4(b)所示分别为磷酸铁锂和三元电池模块的3次放电容量曲线。图5 商业化磷酸铁锂电池和三元电池模块的倍率放电曲线 磷酸铁锂电池模块的放电电压平台约为...
  • MIMO信道容量的Matlab仿真程序,可自己修改发射天线NT和接收天线NR的值
  • Redis容量评估

    万次阅读 2018-03-18 10:51:53
    在进行Redis的容量评估之前,有必要了解一下Redis常用的数据结构。 1.SDS  redis没有直接使用c语言传统的字符串(以空字符为结尾的字符数组),而是自己创建了一种名为SDS(简单动态字符串)的抽象类型,用作...
  • 项目中,看到大家已经意识到初始化HashMap时给Map指定初始容量大小,甚是欣慰。但仔细一看,发现事情好像又有一些不对头。虽然指定了大小,却让性能变得更加糟糕了。 可能你也是如此,看了《阿里巴巴Java开发手册》...
  • 原始容量、可用容量和有效容量的介绍 以下是有关原始容量,可用容量和有效容量的介绍 原始容量:为存储系统配置的物理容量 可用容量:原始容量减去用于RAID保护和元数据的容量 数据减少率:在线重复数据删除和...
  • 迭代算法实现离散信道容量,道是信息传递的通道,承担信息的传输和储存的任务,是构成通信系统的重要组成部分。信道容量是指信道能够传输信息量的大小。信道容量的研究在现实中有着非常重要的理论意义。而信道容量的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 944,897
精华内容 377,958
关键字:

容量