裸泳的猪

沾沾自喜其实最可悲

0%

主机信息:阿里云ECS

CPU&内存:1核2 GiB

磁盘:100G

操作系统:CentOS 8.4 64位

1.gitlab镜像拉取

1
2
# gitlab-ce为稳定版本,后面不填写版本则默认pull最新latest版本
$ docker pull gitlab/gitlab-ce

2.运行gitlab镜像

1
2
3
4
5
$ docker run -d  -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /root/gitlab/config:/etc/gitlab -v /root/gitlab/logs:/var/log/gitlab -v /root/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
# -d:后台运行
# -p:将容器内部端口向外映射
# --name:命名容器名称
# -v:将容器内数据文件夹或者日志、配置等文件夹挂载到宿主机指定目录

以上操作完似乎就可以使用了,/root/gitlab/config 中有root用户的初始密码。

3.然而

运行后主机死翘翘了,内存太低,直接100%,ssh都登不上了。

不慌,阿里巴巴控制台强制重启,然后进去把docker中的gitlab停了。

4.低配置主机添加swap空间

使用磁盘当内存,速度慢但还勉强能用。

一.添加SWAP空间

使用dd命令创建名为swapfile 的swap交换文件(文件名和目录任意):

1
1.  dd  if=/dev/zero  of=/var/swapfile  bs=1024  count=2097152  

1
2
3
4
5
   dd  if=/dev/zero  of=/var/swapfile  bs=1024  count=2048k
[root@aliyun ~]# dd if=/dev/zero of=/var/swapfile bs=1024 count=2048k
记录了2097152+0 的读入
记录了2097152+0 的写出
2147483648字节(2.1 GB)已复制,31.7458 秒,67.6 MB/秒

科普:if(即输入文件,input file),of(即输出文件,output file)。dev/zero是Linux的一种特殊字符设备(输入设备),可以用来创建一个指定长度用于初始化的空文件,如临时交换文件,该设备无穷尽地提供0,可以提供任何你需要的数目。 bs=1024 :单位数据块(block)同时读入/输出的块字节大小为1024 个字节即1KB,bs(即block size)。count=2048000 :数据块(block)数量为2048000 ,即2048000个1KB。可以计算swap分区的容量为:1KB 2097152=1KB *1024(k)*10242=2097152=2G。(dd命令里的单位M表示1024*1024,k表示1024)。

1
回车后,会执行2g的读写操作,系统会卡一段时间,耐心等待执行结果。

执行完毕,对交换文件格式化并转换为swap分区:

1
2
3
4
1.  mkswap  /var/swapfile  
[root@aliyun ~]# mkswap /var/swapfile
正在设置交换空间版本 1,大小 = 2097148 KiB
无标签,UUID=f88182d5-1155-4cf4-8cb9-5db460d9ac4e

挂载并激活分区:

1
2
3
1.  swapon   /var/swapfile  
[root@aliyun ~]# swapon /var/swapfile
swapon: /var/swapfile:不安全的权限 0644,建议使用 0600

执行以上命令可能会出现:“不安全的权限 0644,建议使用 0600”类似提示,不要紧张,实际上已经激活了,可以忽略提示,也可以听从系统的建议修改下权限:

1
1.  chmod -R 0600 /var/swapfile  

这时候可以用 free –h 或 swapon –s命令查看新swap分区是否正常添加并激活使用。

修改 fstab 配置,设置开机自动挂载该分区:

1
1.  vim    /etc/fstab  

在fstab文件末尾追加如下内容后:wq!保存即可:
/var/swapfile swap swap defaults 0 0
或直接对fstab进行echo追加:

1
1.  echo  "/var/swapfile   swap  swap  defaults  0  0" >>  /etc/fstab  

二. 删除某swap分区

先停止正在使用swap分区:

1
1.  swapoff  /var/swapfile  

删除swap分区文件

1
1.  rm -rf   /var/swapfile  

删除或注释掉我们之前在fstab文件里追加的开机自动挂载配置内容:
/var/swapfile swap swap defaults 0 0

————————————————–

三. 更改Swap配置(进阶级)

swappiness值(0-100),系统对swap分区的依赖程度,越高则越倾向于使用swap分区。
当然,高度依赖swap会造成物理内存远未使用完,就使用swap分区,我们知道swap分区性能远不如物理内存,这反而降低了系统性能,违背了我们创建swap分区的初衷。
我们希望在物理内存即将满荷时再使用swap,这就决定了swappiness值一般为10-60为宜,固态硬盘可以偏高些。
查看当前的swappiness数值:

1
1.  cat   /proc/sys/vm/swappiness   

修改swappiness值,这里以50为例。

1
1.  sysctl vm.swappiness=50   

若希望vm.swappiness=50永久生效,则需要修改sysctl配置文件,直接echo追加配置内容,重启系统后即可生效:

1
1.  echo "vm.swappiness = 50"  >>  /etc/sysctl.conf

————————————————–

四. 增加(扩大)swap分区大小

  1. 首先我们来查看swap空间的大小
1
2
3
4
5
# free -m
total used free shared buffers cached
Mem: 2026 1931 95 0 15 1789
-/+ buffers/cache: 127 1899
Swap: 3074 2 3071
  1. 用dd命令创建一个2G大小的文件(102410242=2097152)

dd if=/dev/zero of=/var/swapfile1 bs=1024 count=2097152

1
2
3
4
[root@aliyun ~]# dd if=/dev/zero of=/var/swapfile1 bs=1024 count=2097152
记录了2097152+0 的读入
记录了2097152+0 的写出
2147483648字节(2.1 GB)已复制,48.2387 秒,44.5 MB/秒
  1. 将该文件创建为linux swap

mkswap /var/swapfile1

1
2
3
[root@aliyun ~]# mkswap /var/swapfile1
正在设置交换空间版本 1,大小 = 2097148 KiB
无标签,UUID=43c47001-58a3-43ec-8510-bc8b2ad2ff51
  1. 激活该文件

swapon /var/swapfile1

1
2
[root@aliyun ~]# swapon /var/swapfile1
swapon: /var/swapfile1:不安全的权限 0644,建议使用 0600
  1. 至此添加swap空间成功,但此时只要系统一重启就会丢失这个swap空间,所以我们要设置一下/etc/fstab文件,
    在文件的末尾加上/var/swapfile1 swap swap defaults 0 0

  2. 查看大小 free -h

1
2
3
4
[root@aliyun ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 1.1G 73M 22M 606M 496M
Swap: 4.0G 1.0G 3.0G

事务

Raft

Raft 协议是一个分布式共识(consensus)算法。

为了达到易于理解的目标,raft做了很多努力,其中最主要是两件事情:

  • 问题分解
  • 状态简化(而状态简化更好理解,就是对算法做出一些限制,减少需要考虑的状态数,使得算法更加清晰,更少的不确定性(比如,保证新选举出来的leader会包含所有commited log entry))

1 问题分解

Raft 协议将 consensus problem 划分为下面的几个子问题, 分别提出对应的解决方案:

  • Leader Election
  • Log Eeplication
  • Safety

Raft 算法首先从集群所有节点中选举出一个 Leader, 其余节点称为 Follower, 由 Leader 来负责管理日志. Leader 负责处理用户的请求, 并将之转化为日志, 并复制到其他的节点上. 当 Leader 将日志复制到大多数节点时, 就能将之应用(apply)到状态机, 并将之 commit, 最后将结果返回给用户.

为了保证日志条目(log entry)的有序性, 算法将时间划分为不同的 term, term 是一个连续的单调递增的整数. 当节点中发生 Leader 选举时, term 加一, 当节点观察到比自身更大的 term 时, 切换到该 term. 同时, 每条日志具有一个 index 来唯一标记, index 同样单调递增, 新的日志的 index 大于旧的日志的 index. 算法中用 term 和 index 来标记日志.

原文链接:https://www.cnblogs.com/xybaby/p/10124083.html

背景:

设备:MacBook Pro2018 A1989
系统:BigSur11.2.3
外接的显示器:Dell P2319H

颜色问题

mac 会将外接显示器识别为TV,会用 YCbCr 色域来输出,我们需要使用脚本来为外接显示器生成强制RGB渲染的颜色描述文件,然后替换掉系统原有颜色描述文件,来使显示器用RGB模式显示。

阅读全文 »

主机信息:阿里云ECS

CPU&内存:1核2 GiB

磁盘:100G

操作系统:CentOS 8.4 64位

1.docker安装

使用官方安装脚本自动安装
安装命令如下:

1
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

启动docker

1
systemctl start docker

查看docker相关版本信息

1
2
3
4
5
#版本信息
docker version
#查找nextcloud版本
docker search nextcloud

2.拉取nextcloud官方镜像

1
docker pull docker nextcloud

接下来可以启动

1
docker run -d --restart=always --name nextcloud -p 8888:80 -v /root/nextcloud:/data nextcloud

#docker run –name nextcloud -p 8080:80 -v /data/nextcloud:/var/www/html/data -d nextcloud

注意在阿里云控制台 》配置安全组规则》入方方向开放端口

7 项目成本管理

项目成本管理过程包括:

7.1 规划成本管理

— 确定如何估算、预算、管理、监督和控制项目成本的过程。

  • 绩效测量规则。需要规定用于绩效测量的挣值管理(EVM)规则。例如,成本管理计划应该:
    • 定义 WBS 中用于绩效测量的控制账户;
    • 确定拟用的 EVM 技术(如加权里程碑法、固定公式法、完成百分比法等);
    • 规定跟踪方法,以及用于计算项目完工估算(EAC)的 EVM 公式,该公式计算出的结果可用 于验证通过自下而上方法得出的完工估算。

7.2 估算成本

— 对完成项目活动所需货币资源进行近似估算的过程。

进行成本估算,应该考虑将向项目收费的全部资源,包括(但不限于)人工、材料、设备、 服务、设施,以及一些特殊的成本种类,如通货膨胀补贴、融资成本或应急成本

7.2.2.2 类比估算

见 6.4.2.2 节。成本类比估算使用以往类似项目的参数值或属性来估算。项目的参数值和属性包 括(但不限于)范围、成本、预算、持续时间和规模指标(如尺寸、重量),类比估算以这些项目 参数值或属性为基础来估算当前项目的同类参数或指标。

7.2.2.3 参数估算

见 6.4.2.3 节。参数估算是指利用历史数据之间的统计关系和其他变量(如建筑施工中的平方英 尺),来进行项目工作的成本估算,参数估算的准确性取决于参数模型的成熟度和基础数据的可靠 性。参数估算可以针对整个项目或项目中的某个部分,并可与其他估算方法联合使用。

7.2.2.4 自下而上估算

见 6.4.2.5 节。自下而上估算是对工作组成部分进行估算的一种方法。首先对单个工作包或活动的 成本进行最具体、细致的估算,然后把这些细节性成本向上汇总或“滚动”到更高层次,用于后续 报告和跟踪。自下而上估算的准确性及其本身所需的成本,通常取决于单个活动或工作包的规模或 其他属性。

7.2.2.5 三点估算

见 6.4.2.4 节。通过考虑估算中的不确定性与风险,使用三种估算值来界定活动成本的近似区间, 可以提高单点成本估算的准确性: uu 最可能成本(cM)。对所需进行的工作和相关费用进行比较现实的估算,所得到的活动成本。 uu 最乐观成本(cO)。基于活动的最好情况所得到的成本。 uu 最悲观成本(cP)。基于活动的最差情况所得到的成本。

基于活动成本在三种估算值区间内的假定分布情况,使用公式来计算预期成本(cE)。两种常用 的公式是三角分布和贝塔分布,其计算公式分别为:

  • 三角分布。cE = (cO + cM + cP) / 3

  • 贝塔分布(默认使用)。cE = (cO + 4cM + cP) / 6

基于三点的假定分布计算出期望成本,并说明期望成本的不确定区间

7.3 制定预算

— 汇总所有单个活动或工作包的估算成本,建立一个经批准的成本基准的过程。

7.4 控制成本

— 监督项目状态,以更新项目成本和管理成本基准变更的过程。

对成本的影响力在项目早期最大,因此尽早定义范围就至关重要。

项目成本管理的核心概念

项目成本管理重点关注完成项目活动所需资源的成本,但同时也应考虑项目决策对项目产品、 服务或成果的使用成本、维护成本和支持成本的影响。

项目成本管理的趋势和新兴实践

在项目成本管理的实践中,通过对挣值管理 (EVM)的扩展,引入挣得进度 (ES) 这一概念。

挣值管理(Earned Value Management, EVM)

基础概念

1.计划价值(Planned Value, PV),截止到某时间点计划要完成工作量的价值,也就是计划要做多少事;

2.挣值(Earned Value, EV),截止到某时间点实际已经完成工作量的价值,也就是实际做了多少事;

3.实际成本(Actual Cost, AC),截止到某时间点实际已经发生的成本,也就是实际花了多少钱;

4.完工预算(Budget At Completion, BAC),对完成该项目的计划预算,也就是完成整个项目计划多少预算;

例:假设我们现在要做一个项目,就是砌一堵长度为100米的围墙,为了方便计算我们假设总的预算是100元每米,共100*100=10000元,我们还计划项目工时10天(每天砌墙10米)来完成这个项目。

本来第四天工作结束计划完成40米,计划价值PV=4000。

实际第四天工作结束实际才完成了30米,挣值EV=3000。

第四天结束实际却花了5000元,实际成本AC=5000。

总的预算10000元,完工预算BAC=10000。

绩效指标

5.成本偏差(Cost Variance, CV),截止到某时点发生的实际成本与计划成本的偏差,CV=EV(挣值)-AC(实际成本)

6.进度偏差(Schedule Variance, SV),截止到某时点的实际进度与计划进度的偏差,SV=EV(挣值)-PV(计划价值)

7.成本绩效指数(Cost Performance Index, CPI),截止到某时点衡量成本绩效的一种指标,也就是实际每花一元钱,完成做了多少钱的事(花钱的效率),CPI=EV(挣值)/AC(实际成本)

8.进度绩效指数(Schedule Performance Index, SPI),截止到某时点衡量进度绩效的一种指标,也就是实际完成的工作量与计划完成工作量之比,**SPI=EV(挣值)/PV(计划价值)**。

成本偏差CV = EV - AC=3000-5000=-2000,说明现在成本超支了2000。

进度偏差SV = EV - PV=3000-4000=-1000,意思是相比计划我们的进度落后1000元的工作量。

成本绩效指数CPI = EV / AC=3000/5000=0.6,意思是前面4天我们实际花了5000元,但是只做了3000元的工作,相当于前面4天我们每花1元钱,只做了0.6元的事,此概念计算要掌握。

SPI=EV/PV=3000/4000=0.75,说明当前只完成了计划任务量的75%的工作。

预测指标

  1. 完工尚需估算(Estimate To Completion, ETC)
    • 如果还是以当前的成本绩效完成剩余的工作,则 ETC=(BAC-EV)/CPI,也就是剩余的工作量除以成本绩效指数;
    • 如果以计划的成本绩效完成剩余的工作,则ETC=BAC-EV,也就是剩余的工作量,实际上也是用第一种情况那个公式(CPI=1);
    • 如果进度绩效指标SPI也会影响完成剩余工作的成本,意思是如果严格规定我们必须要在计划的截止时间之前完成项目,那么可能就还需要额外的成本来赶工进度,这个时候就需要同时考虑CPI和SPI对于剩余工作的影响,一般计算公式则为**ETC=(BAC-EV)/(CPI*SPI)*,也就是剩余的工作量除以成本绩效指数与进度绩效指数的乘积;其中CPISPI又叫“关键比率”(Critical Ratio, CR);

10.完工估算(Estimate At Completion, EAC),在某个时点,预测完成整个项目需要的成本,当然就是实际已经花掉的成本加上前面那个完工尚需估算ETC,EAC=AC+ETC;如果剩余工作还是以当前成本绩效指数来完成,那么也可以这么计算EAC=BAC/CPI,这个公式也好理解,其实就是整个项目工作量除以成本绩效指数;完工估算EAC实际上就是预测项目完工时候的实际成本AC。

11.完工尚需绩效指数(To-Complete Performance Index, TCPI),在某个时点,预测如果要在计划的预算内完成项目,则未来的工作必须要达到的绩效水平。计算公式TCPI=(BAC-EV)/(BAC-AC),也就是剩余的工作量除以剩余的钱的数量;

12.完工偏差(Variance At Completion, VAC),在某个时点,预测项目在完工的时候将会出现的总的项目的成本偏差。计算公式VAC=BAC-EAC,也就是项目开始时原计划的预算减去现在预测的总个项目将会花的成本。完工偏差VAC实际上就是预测项目完工时的成本偏差CV。

第一种情况:后续部分工作CPI和前面4天工作的CPI保持一致。

完工尚需估算ETC = (10000 - 3000)/ 0.6 = 11667,现在只完成了30米,那么剩下当然就是还需要砌70米了,转化成钱的数量70*100=7000元这就是剩余的工作量。

完工成本估算就是5000+11667=16667。CPI一直保持稳定不管前面4天还是后面工作一直都是0.6,所以也可以用总的项目预算(总的工作量)除以CPI得出,也就是10000/0.6=16667。

那么后面工作的成本绩效必须得是多少才行,这个就是TCPI。第四天结束后总共10000元的工作量,完成了3000元剩余7000元的工作量,实际花了5000元(预算就还剩10000-5000=5000元),也就是未来如果预算不增加我们需要以剩下5000元的预算来完成剩下7000元的工作,那么需要的成本绩效指数就是TCPI = 7000/5000=1.4。

我们前面已经算出来ETC=11667,EAC=16667,这个情况下完工偏差VAC=BAC-EAC=10000-16667=-6667

4.项目整合管理

项目整合管理包括对隶属于项目管理过程组的各种过程和项目管理活动进行识别、定义、组合、统一和协调的各个过程。

在项目管理中,整合兼具统一、合并、沟通和建立联系的性质,这些行动
应该贯穿项目始终。

项目整合管理的核心概念

  • 项目整合管理由项目经理负责。
  • 项目整合管理的责任不能被授权或转移。只能由项目经理负责整
    合所有其他知识领域的成果,并掌握项目总体情况。
  • 项目经理必须对整个项目承担最终责任。
阅读全文 »

前言

在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了资源的开销。

而线程池不允许使用Executors去创建,而要通过ThreadPoolExecutor方式,这一方面是由于jdk中Executor框架虽然提供了如newFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()等创建线程池的方法,但都有其局限性,不够灵活【消耗内存等】;另外由于前面几种方法内部也是通过ThreadPoolExecutor方式实现,使用ThreadPoolExecutor有助于大家明确线程池的运行规则,创建符合自己的业务场景需要的线程池,避免资源耗尽的风险,所以阿里巴巴java开发规范线程池首选ThreadPoolExcutor。

话虽如此但常见的Executor框架还是要有所了解。

阅读全文 »

消息队列

作用:

  1. 异步
  2. 削峰
  3. 解耦

异步

比如一个流程下需要正常的业务处理,中间需要发送短信,扣减优惠卷等,可以生产消息进入队列,由短信系统,优惠卷系统异步处理,减少主业务逻辑链路,提升效率。

解耦

异步,使用线程,线程池去做不是一样的么
线程,线程池代码需要固定,后续如果光是短信平台要改东西,主流程还要发布。消息队列可以实现解耦。

削峰

服务器,Redis,MySQL各自的承受能力都不一样,你直接全部流量照单全收肯定有问题啊,直接就打挂了。

阅读全文 »

主流消息队列选型

维度 Kafka RocketMQ RabbitMQ ActiveMQ
单机吞吐量 10万级 10万级 万级 万级
开发语言 Scala Java Erlang Java
高可用 分布式架构 分布式架构 主从架构 主从架构
性能 ms级 ms级 us级 ms级
功能 只支持主要的MQ功能 顺序消息、事务消息等功能完善 并发强、性能好、延时低 成熟的社区产品、文档丰富
  1. rocketmq主要为java开发,语言适配性好,
  2. 性能好,社区成熟。
  3. 支持顺序消息,事务消息。
  4. 支持分布式架构
阅读全文 »