微信月活9亿的高效运维之路

2023-11-15

07f9e3462b15485c21d25e699041e7ad7f25e84a

微信业务量增长的时候,其实我们比较关心的是效率。前期可能两三个月就涨了1倍的量,我们怎么能够保证我们的运营效率是跟得上的?后期可能主要是关心成本。我们在2014年以后增长有点放缓,所以主要的精力会在成本这个方面。

分为四块来说:

6cbdcd5c6eb85d7eaf2497b201d8295cc5bfd797

运营规范
云化管理
容量管理

自动调度

运营规范

配置文件规范

b6a06fc8d3c870cd9884fc15a051efd10aef5a8d

先来看配置文件规范,我们前期花了比较多的精力。可能整个系统设计比较复杂,最开始都会有一些配置管理工程师专门来处理,后期我们把这块搞得比较规范了。

配置文件规范分为下面几项:

目录结构标准
这就是一个服务部署上线的时候怎么定义它的目录结构,大家应该先做好这些目录结构标准的定义。

跨服务的相同配置项管理
为什么提这一点?可能有些配置项你会在这个服务里需要这几个配置项,在另一个服务里也需要这几个配置项。如果更改这个配置项的时候,你是不是把服务A发一遍,服务B也发一遍?我们有一套机制,每台机每个目录下都会有一个全局共用的配置项,我们会通过一些自动化的灰度的方式来控制这里的发布,这一块是单独拎出来的。

同一服务内不同实例的差异配置项管理
不确定大家运营时会不会碰到类似的问题,就算你用Docker了你镜像管理挺好的。你部署个实例出来,可能你们的业务就需要你把实例1上做一些调整,当然你也可以用脚本来管理。但是我们觉得这是比较复杂的状态,我们会把这些差异性全部给它统一抽取出来,尽量做到所有的环境下它的配置文件的MD5都是一致的。

开发/测试/现网的差异配置项管理
前期也会有这个问题,开发环境我们一般不管,测试环境也是运维来负责管理,现网当然是运维管理的。基本上测试和现网的差异只有路由的差异,其他的配置项我们都保证它是完全一致的。做这么一个要求,大概实现的效果是不管你通过什么手段扩容,我们直接一个镜像打过去或者直接一个包拷过去就可以了,不会再有后续的脚本来改动它。

 

同一服务下同一版本的多个实例,在所有环境下配置 文件的md5都严格一致。

名字服务规范

6b091bb304d9dab736f2e35b20769b2fd4d12585

名字服务这块比较重要,分三层:

  • 接入层 类LVS实现
  • 逻辑层 类etcd实现
  • 存储层 路由配置自动化

服务伸缩是运维工程,独立于研发的变更发布。

接入层和逻辑层,都是类似的实现,我们内部根据我们的业务特性做了一些业务开发。

存储层跟QQ有点不一样,QQ好像是逻辑层和存储层都是用同一个名字服务实现,我们在存储层这里还没有做这方面的配置。

我们现在存储层跟逻辑层隔得比较开,在涉及到数据的方面,我们差不多可以认为是运维能够配置的方式,但是又不完全是能够配置,用那些辅助脚本来配置。

服务伸缩是运维工程,我们不希望在服务伸缩时还考虑别的因素,独立于研发的变更发布。我们有个特点,我们研发是通过运维提供的变更系统,他在上面基本上不需要做什么操作,整条链就打通了,运维不用关心变更发布,只需要管好服务伸缩就好。

数据存储规范

8558e9b846e5558c6a7390fdf5958dff78d00065

  • 接入层 不带数据
  • 逻辑层 带短周期cache、带静态数据、禁止动态数据落地
  • 存储层 带长周期cache、基于paxos协议的数据落地

接入层和逻辑层的服务伸缩,无需考虑数据迁移和cache命中率。

数据存储方面,单独拎一页出来是觉得这个场景是比较多人中招的,比如接入层肯定不会带什么数据的,逻辑层我希望它是不带数据的,而且我们也严格要求不带数据的。

经常出现这样的场景,他的逻辑层要自动伸缩,跑了一段时间上线了一些逻辑在上面保存了一些数据,在下面做缩容的时候是不是就中招了,会有这个问题,所以我们会定这个规范。

逻辑层是不带数据的,会有静态数据,包括用户发的消息、用户发的朋友圈,很明显应该放到存储层的。

接入层不带数据,其实历史上我们也有一次是带了数据的,在每次过年抢红包的时候,所有人都在摇的那一把,其实那个量是非常恐怖的,摇红包那个点我们做设计是每个摇红包的请求真的打倒我们接入层,不会有客户端摇五次才有一次请求上来。我们的接入层的性能保证我们能抗住这个量,但是后面的逻辑层肯定撑不了这个量,1秒钟几千万,这个时候我们会做一些很特殊的逻辑,在接入层直接带上红包数据,当然这是比较特殊的场景,我们只在过年的时候这个规范是没有执行的。

运营规范小结

0da65c5f0fea094cc7abf447cf385e30f3033e90

  • 阶段目标
  • 服务可运维
  • 落实措施
  • 变更系统拦截
  • 全网扫描不规范的服务

这里说了几点,我们的目标简单来说就是服务可运维,可运维的意思就是你做扩容缩容的时候不需要做人工的操作,如果做人工的操作就是不可运维。

我们为了实现服务可运维,在变更系统里做了一些拦截,它接下来变更可能不符合我们运营规范或者之前有不符合我们运营规范的地方,我们都会拦下来,要求变更,实现我们的运维规范。

云化管理

接下来说一下云,大家用云也挺多的,近几年也比较火,可能大家用得比较多的是Docker,微信这边我们没有用Docker,后面也会说到为什么没有用。

为什么上云

7d25f89a1acf1bbf0e39ed8c8e0acdd0e21cd1df

  • 微服务总数近5k
  • 同物理机上多服务的资源抢占问题

先说为什么要上云,在2013年、2014年时,我们的微服务已经到差不多5000个,其实我是近几年才知道这个叫微服务,我们之前实现方式已经是好多年都算微服务的方式。

其实最开始说微服务这个事情的时候,我记得是QQ那边海量运营的一些课程都会提到,我觉得这个思路跟微服务是完全一致的。

我们运维这边在实现了一套新服务发布的时候,基本上不会给研发有什么限制说你这个服务不要搞太多,所以整个系统搞下来那个量是比较夸张的,当然就会出现他的多个服务要在同一台机上部署,因为里有5000个微服务,一定要同物理机部署。

部署多个服务就会有资源抢占,基于这个因素,我们就上云。

哪部分上云

c7d5036c98e98be92ddcc7e8a44d70eed3a6ac88

  • 接入层 独占物理机、 容量充足、 变更少
  • 逻辑层 混合部署、 容量不可控、变更频繁
  • 存储层 独占物理机、容量可控、变更少

哪一块上云,刚才也说到,接入层因为要扛住比较猛的量,微信的用户也比较多,如果它有什么问题,可能接入层会雪崩。所以我们主要是独占物理机,容量足,变更也少,暂时没有上云的需求。

在逻辑层这里,之前提到5000多个微服务,所以比较混乱,变更比较多,容量也不可控,所以这块上了云。

存储层这里,也没有上云,但是有单独的容量管理和数据迁移。

基于Cgroup的云化

7c5ea687992027b793bde3bf3c76cf5f3e08ad6b

 

  • 虚拟机型定制
  • VC11 = 1个cpu核 + 1G内存
  • VC24 = 2个cpu核 + 4G内存
  • 物理机分片

我们云的方式是直接Cgroup,Cgroup这个名字可能有些人不知道,我们用的是内核Cgroup这种机制。

在现网的时候,用类似简单的虚拟机型定制,比如1个cpu+1G内存。前期我们也有一些流量因素的考虑,后来把它给取消掉了,我们系统架构上保证的那个流量好像是不怎么会成为问题的。

这里简单列了一下虚拟机分片的方式,怎么隔的方式都有,我们隔的这么随意也带来另外一个问题,系统运转过程中会有一些类似于磁盘碎片的东西存在,好像你Windows跑了很久以后也会有磁盘碎片存在一样。这个我们也有一些比较特殊的方法来处理。

线上未启用Docker

bfe49283258db6abd1e22321564256e7ea2469e4

  • svrkit框架100%覆盖全网,已实现标准化规范化
  • 框架本身大量依赖IPC交互
  • 自研非侵入式 vs Docker侵入式

这里列了一下我们没有用Docker的原因。

Docker太火了,我们差不多在2014年、2015年的时候,线上也少量上线了一轮。

我们这个svrkit框架是我们微信内部自研的一套框架,100%覆盖全网,100%什么意思,一点开源代码都没有,包括前面大家可能用得最多的nginx做接入,这个我们也是在自研的切换的,包括后面的存储,前期用了MySQL,后期也都换成自己的组件了。

现网用我们自己的框架100%覆盖了,我们的标准化和规范化都是比较好的。

 

可以说Docker解决的一些问题在我们这里不是问题。

对Docker的需求不是很强烈

框架本身我们用了很多IPC交互

这些东西其实在Docker里都做了很严格的规范,如果我们用Docker,我们可能会把这些Docker里的各种机制破坏掉。如果是这种情况,还不如不用Docker。

对Docker这种接入方式的实现还是有顾虑

早一两年有人跟我讨论比较多,Docker主进程起来的时候,可能你由于要更新Docker本身,会导致你的服务重启。
好像近期已经解决这个问题,这个在早期来看我们认为是一个比较严重的问题,我不希望说因为Docker本身的变更,对线上的服务有任何影响。

 

私有云调度系统

基于上面的点我们自研了一套云化管理的Docker系统。这是我们私有云调度系统:

3a3b1268f4a80a1b06a4bf9b9df13911f7525f3e

  • 基于svrkit框架自研
  • 参考borg/yarn/k8s/mesos等主流调度系统的优点
  • 覆盖80%的微服务

基于我前面提到的svrkit框架+自研,调度系统当然也要用我们自己的调度系统覆盖,目前覆盖了80%的微服务,还差一点点100%覆盖。

私有云调度系统架构

5801b34cc8ef67ba8fc3add2a0f121b3094653df

这是我们的架构,熟悉的人一看就知道跟业界的事情没有什么区别,中间有一些虚拟化的坑,可以认为跟大家用得没有太大区别,不细讲了。

云化管理小结

bd9a4813a34c9ed82694998d1451e0d5bb1d35cd

  • 阶段目标
  • 服务间资源隔离
  • 服务伸缩页面化操作
  • 落实措施
  • 部署系统拦截未上云业务
  • 主动改造核心业务

在云化管理这一块,我们实现的一个目标就是资源隔离,Docker服务之间不要因为一个服务异常搞的第二个服务也异常。

第二是服务伸缩页面化操作,有些服务还是很庞大的,一个服务下几千上万台都可能,这种时候不希望你上机器的,在页面上点就可以了。

我们为了落实这个目标,会把部署系统,把那些没有上云的拦住,他要走旧的部署方式上线,他需要走旧的流程才能走旧的商业模式。

前面这些运营规范和云化管理,相信大家多多少少都会有自己的实现方式,也都会有自己的一些总结。后面容量这块不确定大家都是怎么改这一块的。

容量管理

如何支撑业务发展

 

2b13bfb004410a3aec75d97a71493318aa79bc6b

这是一个业务量增长的曲线,这是我们容量的曲线。

一般来说你扩了一次容就一直平衡在这里,有一个点你发现撑不住了,要扩容,扩上去,就一直保持这个状态,跟容量曲线是不怎么匹配的。

第一个点是你这个容量低于现网的业务量的时候,这其实是容量不足的,能不能很快发现这个问题。

第二个点是处理效率,容量不足的时候把曲线打上去,扩容需要多长时间,如果是几天或者几分钟,这个效率是不一样的。

我们希望实现的一个最优容量的方式,它跟业务增长完全是匹配的方式。

这个曲线并不很难实现,只要扩容够频繁,跟这个就是完全吻合的最优容量的曲线。

你发现它容量不足是分钟级的,扩容也是分钟级的,那你完全可以描出这么一套一模一样的曲线出来。

使用硬件指标评估容量

839256c850964d217c73fe803d2a3c547193931b

我们会说你怎么知道这个服务的容量不足的?一般我们第一个反应就是用硬件指标,包括CPU使用率是多少,磁盘空间多少,网卡容量、内存。这也能解决到问题,但它不能解决所有问题。

使用CPU评估容量

c2fcd496a22f34e3278510c47eeb6db1064805a7

服务容量 = 当前峰值/经验CPU上限

这是一个使用CPU来算服务容量的方式。

这是一个简单的例子,比如你现在CPU当前峰值40%,你自己的经验觉得这个能达到80%的CPU,简单除下就是50%的容量。

硬件指标是否可靠

c9802cf1d8aff4b457e304426aaf353018b89e88

这东西靠谱吗?我这里画了两个示意图:

有些类似左边这张图是靠谱的,容量基本上和CPU保持增长的。

有些类似右边这张图窄口瓶,CPU涨到一定点的时候,容量就上不去。

真实案例

087054982f704f13f3443ebb7655376756d9e621

这是现网打流量的例子,人为把流量打上去,会发现有些服务怎么打都是在80%;有些怎么都是60%,上不去。

硬件指标的局限性

84e5156b373fc8b9eb4cc2fee96a87fa5835b63b

硬件指标我们认为有一些局限性:

  • 第一个是不同服务它依赖硬件的类型,有些是被CPU限制,有些是被内存限制。
  • 第二个是临界点的质量无法预测,当CPU接近80%或者100%这个点的时候,我们观察到有些服务的质量没办法预测,不稳定,有些服务能够跑到80%,CPU还能稳定服务很长时间,有些一到80%,可能有一些请求就不返回了。

确实,线上服务多了以后,做的事情不大可控。

我们觉得应该要通过压测,才能比较准确的得到容量的模型。

压测方式

32d59caedd9c227947e2c3a40972be36c576a7de

压侧方式分两种:

  • 一种是模拟流量
  • 一种真实流量

环境也是分两种:

  • 测试环境
  • 现网环境

四种压测方式

第一种模拟流量在测试环境打的时候,测试团队内部对质量的一些验证,这种测试方式是测试团队负责的,我们没有太参与。

第二种模拟流量打现网有点类似于全链路压测,比如淘宝在双十一经常这么干,对微信来说,我们只在过年这么干,微信过年好像跟淘宝双十一差不多,都是一个比较疯狂的状态,所以我们会在过年前用模拟的流量打一下现网,这个不是一个很常见的压测方式。

第三种真实流量往测试环境打,一般是我们要验证一些存储性能时会这么干,把线上的流量旁路打到测试环境里面,看一下这些存储性能的情况,可以在测试环境里比较好的模拟出来,不会影响到现网。

第四种真实流量打现网环境,我这里主要想说的,我们真的在现网压测,用真实的流量打现网环境是什么状况。

现网压测

436957f72fa12b1b04a7489a216cc1ee7147ae9e

现网压测实现起来非常简单,当你名字服务这块实现比较标准的话,都是统一的流程,就是压侧流程,不停的调其中一个服务的权重,观察它是什么后果就行了。

现网压测可能导致的异常

2ca8185f9df27ceee9a2602f19ddede40f16f6ce

这样压有什么问题,大家都能想到,你压那个服务,什么时候停,怎么能保证不要搞出事来。我们认为这里有以下三个点:

  • 第一,压测会不会引发故障,你能不能及时发现。
  • 第二,压测有没有可能带来一些底层的问题,其实你的监控是发现不了的。
  • 第三,真的出故障以后,你怎么能快速恢复。

我认为这三个问题是比较关键的。

服务的自我保护

5b9b2e43cd5f1ab558bfca459b112a170bfe1ff3

你的各个服务有没有做好自我保护。我们引入了一个快速拒绝的概念,这个服务正常的时候,可能你的上线每分钟100万个请求也是能正常服务的,上游服务给你500万的时候,你只能处理100万,你能不能把其他400万个请求拒绝掉,这是我们框架实现的能力

上游服务的重试保护

85982c2fd6de501174a2cbb41193c0bfb57d87bc

上游服务重试保护是怎么样的?比如你在压其中一个实例的时候,你一直加大它的权重,导致它快速拒绝返回失败了,那你有没有一个机制走到其他的实例把整个流程跑完,这也是一个比较关键的点,这个我们也是在框架里支持了。

立体化监控

9a4ab32d897103ca89e8b0981e3e3e07ac16a00b

监控体系够不够完善,包括硬件的监控,刚才提到快速拒绝的监控,还有前端跟后端这种耗时的监控,还有刚才提到的前面这种,有没有发生失败,整条线都是我们需要关注的。

可以这么说,有了服务的自我保护、上游服务的重试保护、立体化监控,我们才敢压测,如果这三个点搞不定,压测这个事情做不了。

秒级监控

 

44c305086d7c7fff1b406a2351086ff6d85aaa74

能不能快的发现你的异常?为了这个问题,我们把分钟级的监控升级成了秒级的监控,所有的异常差不多都是10秒钟之内就能发现。

整个实现的方式大家应该都差不多,每台机都有个采集的,之前是每分钟上报一次到队列,然后再汇总,然后再入库。现在我们改了这个逻辑,6秒钟做一次采集,然后数据转化,然后做一个秒级数据的汇总。

上面还是分钟级的。

放量速率动态控制

3c2c44e3de4cc9cf3cf6c5adcf5dd2e26e17d0cf

这里还有一个速率的动态控制,这里比较复杂,不知道怎么解释这种情况。

左边这张图是我们比较早期压测的实现方式,它从一个点开始,可能用一个比较快速的调整它权重的方式,直到调用失败出来了,然后再回退,再继续往上压,不停往上不往下,用这种方式来接近你的容量上限。这个点大家很明显看到一个问题,运维在压测的时候其实是给自己找事,每次压测都打上来,又掉下去,打上来。失败曲线就像狗啃的一样,一直有抖来抖去的曲线。这种压测方式,运维自己都受不了。

后面我们调了一下,其实这个也跟我们服务框架提供的能力相关,我们整个服务框架会有一个入队/出队的机制,每个微服务本身都会有这样的机制。这里的队列的积压情况是比较关键的指标,我们会监控入队延迟,它出队,发现它一有积压,性能已经跟不上了,我们通过这种指标来调整压测的速率,大概实现的效果是右边这张图。前期是比较快的权重,当观察到队列已经有积压有延迟,就开始放缓,一直达到一个点,可能最后那个点是有一点点压测失败,实现这么一个效果,整个过程中可能只有几秒钟,就得到性能模型,得到压测真实的值。

现网压测效果

6e3df09c63485994febeddc05ac61e9554b5d7e0

这是我们真实的线上压缩的结果。

这张图打出来的斜率是先涨得比较快,后期再慢慢增长,然后把这个压测点停掉了。

为了打出这张图的效果,我们还搞了蛮久的,可能大概一年多才达到这种现状,基本上不会给现网服务带来失败的。

容量管理小结

c4b229be2f96b20875d918d947f9e40e9516206a

这个事情我们做完了,觉得有几方面的收益:

服务的资源需求可准确量化
刚才提到几百微服务,每个是怎么算出来的。

  • 可确认服务的最优机型

怎么知道你这个微服务适合于哪种机型?有些服务根据我们压测会发现它有些场景跟别人不一样,我们只要把自动化压测的方式实现了,每个模型试一下,压出来你知道它最优的机型是怎么样的。

自动调度

业务增长的自动扩容

37c506a3191eadd54b088368755c77d63ae44cb3

解决业务增长的自动扩容,因为你的业务量在涨,其实你的用户的请求包括各种请求量都是跟着指标在涨的,你知道业务量怎么增长,知道微服务怎么增长曲线,前面的压测又知道每个实例的性能怎么样,你就能够准确知道我现在容量大概比例是在哪条线上。

我们一般让它跑在50%、60%这个区间内,66%是一个容灾的预留,我们先部署三个IDC里面,你要想挂掉两个,另外一个也不会有什么异常的话,可能就是这两个限。

我们会留出一些时间给采购机器给我们,会把一些服务的流量控制在50%这个点。

异常情况的自动扩容

59ea8cb690b4227f5d4b2133818d031ee354c03e

还有一些异常的情况:

 

  • 业务量的突增

这种某些产品搞活动没有通知我们,我们会用一些粗暴的方式来解决,包括说CPU,我们会给它定一个点,当你的CPU冲过这个点的时候,我们会自动发起扩容。

 

 

  • 程序性能下降

你业务没有太大有变化,但你程序变了,这其实也会导致容量不ok。这个点我们是能够监测到这种情况的,就看我们压测的频率有多频繁,如果你每天都压测,你把压测的曲线描出来。

程序性能下降的合理性评估

549e170ec738a26e580c25f20e3b946c703bcb34

我们差不多有些服务是2015年每天都在压,每一天他的性能是怎么样的,我们描出一条曲线出来。可能会发现有一些时间点性能下降比较远,比如这里的例子是他发了个大版本,特性里面增加了一些处理逻辑,所以性能下降比较明显。这个事情可能过了一两个月以后,有些同事出来解决fix它,这种性能监控我认为在前面的容量管理和智能交互这一块的副产品,这个副产品我们用得还比较多的,可以准确知道整个微服务性能变化怎么样。

性能管理闭环

5a186f45834271d7658fdfb43751eb2cd7163e18

能不能不要让它出现这种新的下降的点,我们每天都在压,能不能再快一点,直接在它上线的时候直接拦住。比如说开发同学灰度上了一个台机,我们马上压测它灰度上线的这台的这个机器,看它的性能怎么样,如果发现它的性能下降,就把他拉住。

几种业务形态

12f340f3a367d511abbfcf1f36275acfdafb3ba0

这是我们现网的一些业务形态,可能比较多的就是最上面这种图,它在晚上9点到10点迎来它的最高峰。

中间这种图一般跟工作相关的如微信,工作时间段用得比较多的。

还有一种是最底下这种,比较典型的例子是微信活动,微信活动好像是晚上22点的时候会来一步。还有一些比较古老的业务,漂流瓶,用得脑残粉还挺多的,他们会守着0点的时候。

削峰填谷

bcee430688575709d7972969141d9cc096f7ceef

我们对这些业务曲线希望做什么?

第一,峰那么高,我们所有的设备都是为了应付最高的那个峰,这个峰能不能做点特殊处理,不给它们危险设备。

第二,晚上零点以后,这么低的业务量,设备挺浪费的。

我们希望有一个削峰填谷的作用,原理还是很简单,就是把你的有些服务跟另外一些服务的峰值错开。有些服务高峰期过了,把它的资源放弃出来,至于谁去用它不管。

在线业务削峰

01916cad9ff747ccfbb75cdd33b28142db5c3265

  • 常规服务 高峰期后释放资源
  • 错峰服务 获取资源

离线计算填谷

9a5358f34b255c88270e7053bba4f0c4a42f24c2

  • 离线任务的运行时段
  • 01:00 ~ 08:00 不限任务
  • 08:00 ~ 20:00 任务入队控制
  • 离线任务的资源占用

cpu.shares + memory.limit_in_bytes + blkio

  • 离线任务的优先级最低

离线计算,凌晨那段时间确实都很闲。这个时候比较适合离线计算来调度,微信群之前离线计算的东西比较少,主要是语音输入等一些人工智能方面的东西。最近可能有一些看一看、搜一搜新功能,他们用的离线计算的调度还挺多的。

资源占用方面,这几个场所的配置基本上是Cgroup控制得比较严格一些。

然后把离线任务的优先级调一下,用离线任务来把我们低峰的谷填平了。

自动调度小结

c3394ba315c9b0015e9c4c605e1d9ad690a8f0b6

这在自动调度这块是我们实现的一个目标:

  • 全盘控制所有的在线服务,充分利用资源
  • 离线任务这块不用单独申请计算资源,直接用我们在线上的一些CPU内存就好,存储单独去说。

阅读原文http://click.aliyun.com/m/41339/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信月活9亿的高效运维之路 的相关文章

  • STM32学习笔记:CAN总线的过滤器

    STM32 CAN控制器 提供了28个可配置的筛选器组 F1仅互联型才有28个 其他的只有14个 STM32 CAN控制器每个筛选器组由2个32位寄存器组成 CAN FxR1和CAN FxR2 x 0 27 根据位宽不同 每个筛选器组可提供
  • 使用cBioPortal查看TCGA肿瘤数据

    欢迎关注 生信修炼手册 cBioPortal整合了来自TCGA CCLE以及几个独立的大型肿瘤研究项目的数据 构建了一个易于使用的网站 不需要有深厚的计算机功底 也可以通过该网站查询 分析 可视化肿瘤的相关结果 针对该网站的使用 官方专门发
  • leetcode 322. Coin Change硬币交换问题

    题目详细 描述 You are given coins of different denominations and a total amount of money amount Write a function to compute th
  • 美国国家安全局(NSA)网络攻击主战武器NOPEN

    国家计算机病毒应急处理中心14日正式发布了美国国家安全局专用 NOPEN 远控木马分析报告 揭露了美国情治部门的网络间谍手段 国家计算机病毒应急处理中心 信息安全摘要 近日 国家计算机病毒应急处理中心对名为 NOPEN 的木马工具进行了攻击
  • 排序算法--冒泡排序

    冒泡排序 基本思想 实例演示 代码实现 基础实现 代码优化 基本思想 基本思想 冒泡排序 类似于水中冒泡 较大的数沉下去 较小的数慢慢冒起来 假设从小到大 即为较大的数慢慢往后排 较小的数慢慢往前排 直观表达 每一趟遍历 将一个最大的数移到
  • 雅可比(jacobi)迭代法 matlab实现

    clc clear n input 请输入矩阵阶数 n for i 1 n fprintf 请输入矩阵第 d行 n i A i input end A B 1 input 请输入B向量 n B for i 1 n x i 0 x2 i 0
  • 动态规划之完全背包问题

    完全背包问题 题目 有 N N N 种物品和一个容量为 V V V 的背包 每种物品都有无限件可用 放入第 i
  • javascript 的MD5代码备份,跟java互通

    var MD5 function string function RotateLeft lValue iShiftBits return lValue lt
  • mybatis 批量增加 Parameter '__frch_item_0' not found. Available parameters are [list]

    当在mybatis用到foreach的时候 会报这个错误Parameter frch item 0 not found Available parameters are list 会出现的几种解决方案 例子 sql view plain c
  • 【Linux操作系统】【综合实验二 vi应用与shell脚本编辑】【浅试编辑命令】

    文章目录 一 实验目的 二 实验要求 三 实验内容 1 继续练习Linux系统的文件类 目录类 进程管理类与磁盘操作类常用命令 并使用常见的选择项 2 了解ed ex行编辑器与Emacs全屏幕编辑器的工作模式 基本操作命令 3 掌握vi的编
  • 静态测试

    之前对 静态测试 一直不怎么理解 一直徘徊在为什么要进行静态测试 看了下面这几篇文章 突然觉得的柳暗花明了 目前我正在测试的项目xx让我烦心的问题终于找到出路了 http qa taobao com p 8017 http qa taoba
  • 资产收集的方法总结

    资产收集的方法总结 文章目录 资产收集的方法总结 前言 一 资产收集基本名词概念 二 相关收集方法 1 fofa 2 google搜索语法 3 logo 4 favicon ico 5 关键字 6 维基百科 7 天眼查 企查查 8 微信公众
  • 设计模式之UML类图该怎么画

    关于可维护 可复用 可扩展 灵活性好的理解 生活中 印刷术和活字印刷 当需要对某些内容修改时 印刷术只要有一丁点变化 就需要重头再来 而活字印刷只需要进行部分修改即可 可维护 只更改要更改的内容 可复用 之前的内容并非用完就无用 后面仍可使
  • Caused by: java.lang.NoClassDefFoundError: javax/tools/ToolProvider

    解决方案 在pom文件中的scala maven plugin插件下面加入一个参数 pom xml配置如下
  • python + selenium实现自动登录操作(以淘宝为例)

    selenium操作不熟练的可以查看一下这篇文章 selenium操作大全 一 登录前准备操作 定位一下相对应html位置 输入一般为input标签 登录按钮一般为button 输入账号密码那块 定位代码 driver find eleme
  • 电脑主板跳线_电脑基础进阶必学知识,详解电脑主板跳线!

    在DIY装机时新手总会有不同的问题 虽然目前网上流传着各种版本的教学文章或者视频 但是细致的小技巧讲解还是有限 不少网友在装机的时候虽然大致明白各个硬件的组合 但是在跳线的环节可以难住了不少的人 也挡住了不少小白用户前进的脚步 确实机箱内部
  • 强化学习算法 DDPG 解决 CartPole 问题,代码逐条详解

    本文内容源自百度强化学习 7 日入门课程学习整理 感谢百度 PARL 团队李科浇老师的课程讲解 使用DDPG解决连续控制版本的CartPole问题 给小车一个力 连续量 使得车上的摆杆倒立起来 文章目录 一 安装依赖 二 导入依赖 三 设置
  • 微信小程序中实现车牌输入功能

    一 成品展示与介绍 在点击输入框的时候会弹出车牌输入键盘 二 相关思路解析 首先车牌号码由31位汉字 26位字母 10位数字组成的 开头第一位由省份简称的汉字 第二位字母根据省份下的城市或地区区分 最后的五位或者六位 是有字母和数字组成的
  • 开发工具篇 程序员计算器

    BYTE数据 到16进制 10进制
  • JVM--基础--27.2--工具--VisualVM--远程连接

    JVM 基础 27 2 工具 VisualVM 远程连接 1 准备工作 准备工作是为了测试使用 1 1 代码地址 https gitee com DanShenGuiZu learnDemo tree master visualvm lea

随机推荐

  • c#读取html 表格,c# – 如何将文本文件读取到DataTable

    我想从txt文件中提取数据并将其放入DataTable中 txt文件中的内容采用以下格式 sometext1 sometext2 sometext3 sometext4 sometext5 sometext6 sometext7 somet
  • java获取实时天气预报数据

    数据是从 www webxml com cn上免费获取的 有需要也可以去购买服务 api可以去该网站查看 这里用的是GET方式请求 每个城市citycode 也需要从这个网站上面去下载 解析xml用到的是xwork core 2 3 15
  • 月薪快6万了!

    和一位本科师兄约饭 比我大一级 当年他的成绩很好 完全能够保送更好高校的研究生 但在大家纷纷从众去读研的时候 他选择了直接工作 去了西二旗一家大厂 具体哪家这里就不明说了 圈子很小 很容易被定位 我问了下他目前的薪资情况 他说了几个数字 现
  • 第一章矩阵及其应用

    矩阵逆运算规律 由于矩阵运算默认不满足交换律 即AB BA 但若存在一钟矩阵B 满足AB BA 就满足了交换律 单位矩阵就是特殊的一种AB BA 单位矩阵定义是这样的 lt 设A为n阶方阵 则A aE aE A aA gt 也就是说 数量阵
  • Oracle 的drop table if exists功能

    Mysql 创建表之前判断表是否存在 如果存在则删除已有表 DROP TABLE IF EXISTS SH PLACARD INFO Oracle 创建表之前判断表是否存在 如果存在则删除已有表 declare num number beg
  • 如何使用JMeter进行压力测试

    一 前期准备 首先需要在官网下载jmeter 下载完之后打开bin目录下的jmeter bat 在jmeter bat中对所要压测的接口进行压力测试 二 具体步骤 1 创建线程组 在线程组中设置线程的个数 持续时间和循环次数 如下图所示 2
  • PMI632

    1 目录 drivers power supply qcom qpnp smb5 c charger driver drivers power supply qcom smb5 lib c 依赖的SMB library arch arm64
  • CTF_Web:php伪随机数mt_rand()函数+php_mt_seed工具使用

    CTF Web php伪随机数mt rand函数漏洞 0x00 问题描述 0x01 mt rand函数 0x02 CTF例题 0x03 php mt seed工具使用 0x04 参考文章 0x00 问题描述 最近在题目练习的时候遇到了一个伪
  • Gulp入门使用(一)

    Gulp入门使用教程 Gulp的简介 为什么是Gulp 安装Gulp 创建Gulp项目 目录结构 第一个Gulp任务 Gulp执行预处理 Node中的通配符 监听Sass文件 使用Browser Sync自动刷新 Gulp的简介 gulp
  • 开学c语言测试,初学c语言之开学第一次打卡

    近日开学 忙了好多事 因此隔了好久才写了这篇博客 话少 就直接进入正题了 数数字问题 这是题目 输入一个整数 输出每个数字对应的拼音 当整数为负数时 先输出fu字 十个数字对应的拼音如下 0 ling 1 yi 2 er 3 san 4 s
  • 签约多方共建石嘴山智慧康养新模式

    5月13日 百度智能云与石嘴山市民政局 中国电信股份有限公司石嘴山分公司 中国银行股份有限公司石嘴山市分行 石嘴山市青鸟颐居养老服务有限公司在宁签订 石嘴山市智慧康养战略合作协议 将发挥各自优势 合力推进智慧康养产业高质量发展 提高智慧养老
  • 解决 ios 输入框属性--placeholder--不显示

    在我们写移动端项目时 会发现在IOS手机上 部分输入框的默认文字会隐藏 在此提供一套解决方法 此方法已经历过实际项目的测试 可放心的应用于实战 将此段js代码放置在项目的公共js文件中即可 if placeholder in documen
  • 海湾汉字编码表全部_汉字编码简明对照表

    汉字编码简明对照表 说明 1 下列汉字取自国标 GB 2312 80 中的分级与排列内容 包含所有的第一级汉字和第二级汉字中的常用部分 2 第一级汉字 16 55区的汉字 以拼音字母为序进行排列 同音字以笔形顺序横 竖 撇 捺 折为序 起笔
  • 生成式对抗网络(GAN)-(Generative Adversarial Networks)算法总结(从原始GAN到....目前)

    本文将按时间顺序总结gan的paper 非所有 会挑选个人认为比较重要的 并将参考其它博客 会给出链接 如有侵权 请私信删除 更新于 19 IS 可以反应图像的生成质量 越大越好 FID 则会更假注重生成的多样性 越小越好 IS score
  • mysql评审_第3章 代码检查、走查与评审

    代码检查与走查 代码检查 走查以及可用性测试是三种主要的人工测试方法 人工测试技术在查找错误方面非常有效 应该在程序开始编码之后 基于计算机的测试开始之前使用这些方法 本章主要介绍的是代码检查与走查的相似之处 而它们的不同之处将在后续章节中
  • Apache和Tomcat

    一 Apache和Tomcat的区别 Apache只是一个Web服务器 可以作为独立的web服务器来运行 不过只支持静态网页 如 asp PHP cgi jsp 等动态网页的就显得无能为力 Tomcat也可以作为独立的web服务器来运行 但
  • 什么是docker?docker有什么优缺点?

    Docker的思想来自于集装箱 集装箱解决了什么问题 在一艘大船上 可以把货物规整的摆放起来 并且各种各样的货物被集装箱标准化了 集装箱和集装箱之间不会互相影响 那么我就不需要专门运送水果的船和专门运送化学品的船了 只要这些货物在集装箱里封
  • UE4 C++ 编辑器模式下属性被修改时触发对应事件

    pragma once include CoreMinimal h include GameFramework Actor h include TestActors generated h UCLASS class TESTACTOR AP
  • 【Python】发布一个简单好用的日志记录器bestlog

    需求 日志是非常重要的一个东西 我们往往习惯于在开发一个新项目的第一行代码时 就用 logging info 代替 print 随时保持记录的好习惯 等代码上线以后也无需修改替换那些 print 直接开跑 有了完善的日志 才便于分析生产环境
  • 微信月活9亿的高效运维之路

    微信业务量增长的时候 其实我们比较关心的是效率 前期可能两三个月就涨了1倍的量 我们怎么能够保证我们的运营效率是跟得上的 后期可能主要是关心成本 我们在2014年以后增长有点放缓 所以主要的精力会在成本这个方面 分为四块来说 运营规范 云化