Openstack Swift object replicator 代码分析
在OpenStack Swift中,object replicator的作用是在系统遇到诸如临时的网络中断或磁盘故障后使系统处于一致状态。object replicator会将本地数据与每个远程副本进行比较,以确保它们都包含最新版本。下面会简单分析一下object replicator的代码,了解一下整个Replication的工作流程。
在OpenStack Swift中,object replicator的作用是在系统遇到诸如临时的网络中断或磁盘故障后使系统处于一致状态。object replicator会将本地数据与每个远程副本进行比较,以确保它们都包含最新版本。下面会简单分析一下object replicator的代码,了解一下整个Replication的工作流程。
在我们内部的系统中,有一个tcp的代理服务,用户所有的网络相关的请求,比如访问外网,或者访问在内网的某些服务,都需要通过这个服务,一方面是实现对外网访问的计费,另外也通过白名单机制,对应用的内网访问进行相应的限制。
随着业务量的增加,发现提供服务的机器负载逐渐变高,当流量高峰的时候,经常出现客户端无法连接的情况,本来这个服务也是一个无状态的服务,可以很方便的水平扩容,在添加机器的同时,也尝试去分析一下程序本身的瓶颈,看能否提升一下程序本身的处理能力,通过分析和优化,还是在一定程度上提升了处理能力
在Linux Kernel 4.3中,引入了一个新的cgroups子系统pids,通过这个子系统,可以实现对某个控制组中进程和线程的总数进行限制。
使用前,首先需要挂载该子系统(对于很多的发行版,默认是会挂载的):
[root@test ~]# mkdir -p /sys/fs/cgroup/pids
[root@test ~]# mount -t cgroup -o pids none /sys/fs/cgroup/pids
首先创建一个新的控制组test_max_proc:
[root@test ~]# mkdir /sys/fs/cgroup/pids/test_max_proc
[root@test ~]# ls -l /sys/fs/cgroup/pids/test_max_proc/
total 0
-rw-r--r-- 1 root root 0 Apr 26 09:11 cgroup.clone_children
-rw-r--r-- 1 root root 0 Apr 26 09:11 cgroup.procs
-rw-r--r-- 1 root root 0 Apr 26 09:11 notify_on_release
-r--r--r-- 1 root root 0 Apr 26 09:11 pids.current
-r--r--r-- 1 root root 0 Apr 26 09:11 pids.events
-rw-r--r-- 1 root root 0 Apr 26 09:11 pids.max
-rw-r--r-- 1 root root 0 Apr 26 09:11 tasks
其中,pids.max控制该组中最多可以拥有的进程数,其中线程也包含在其中。pids.current存储了当前控制组的进程(线程)总数。cgroup.procs是需要限制的进程pid。
[root@test ~]# echo 2 > /sys/fs/cgroup/pids/test_max_proc/pids.max
[root@test ~]# echo $$ > /sys/fs/cgroup/pids/test_max_proc/cgroup.procs
[root@test ~]# cat /sys/fs/cgroup/pids/parent/pids.current
2
[root@test ~]# /bin/echo "Here's some processes for you." | cat
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
可以看到限制生效了。由于Linux的线程也是类似进程的实现,因此,当程序有多个线程时,进程和线程的总数也不能超过设定的值
参考:
本篇是Building a Consistent Hashing Ring 第三到第五部分的翻译,上篇翻译了原文的第一到第三部分,在第三到第五部分中,引入了分区概念,多副本,多可用区,以及权重的概念,更加接近一个高可用的实际一致性环
本篇是Building a Consistent Hashing Ring的翻译,原文一步步描述了一个一致性哈希环的构建过程,对于OpenStack Swift存储,对应的Ring文件,其实就是一个一致性哈希环。
这篇文章讲述了OpenStack Swift Ring文件的构建原理。目前翻译了第一部分和第二部分,包含了最原始的算法,并最终引入虚拟节点,减少扩容时的数据移动
ArchLinux下网易云音乐会有偶然的白屏情况,是由于不支持某些emoji字体导致的,可以安装noto-fonts-emoji,然后配置一下字体即可解决:
sudo pacman -S noto-fonts-emoji
配置~/.config/fontconfig/conf.d/51-noto-color-emoji.conf文件:
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<selectfont>
<acceptfont>
<pattern>
<patelt name="family"><string>Noto Color Emoji</string></patelt>
</pattern>
</acceptfont>
</selectfont>
<match target="font">
<test name="family">
<string>Noto Color Emoji</string>
</test>
<edit name="scalable" mode="assign"><bool>true</bool></edit>
<edit name="embeddedbitmap" mode="assign"><bool>true</bool></edit>
<edit name="hinting" mode="assign"><bool>true</bool></edit>
<edit name="hintstyle" mode="assign"><const>hintfull</const></edit>
</match>
<match target="pattern">
<test name="family" qual="first" compare="contains">
<string>emoji</string>
</test>
<edit mode="assign" name="color">
<bool>true</bool>
</edit>
<edit mode="assign" name="family">
<string>Noto Color Emoji</string>
</edit>
</match>
<match target="pattern">
<edit name="family" mode="prepend">
<string>Noto Color Emoji</string>
</edit>
</match>
</fontconfig>
在使用普通用户执行需要超级用户权限的指令时,经常忘记前面加上sudo,等到命令输入完成,再加sudo很麻烦,可以绑定一个快捷方式快速输入最前面的sudo:
如果使用Bash,在~/.bashrc中加入:
bind '"\e\e":"\C-asudo \C-e"'
如果使用Zsh,在~/.zshrc中加入:
bindkey -s '\e\e' '\C-asudo \C-e'
生效后,只需要连续按两下ESC键,即可快速将sudo添加到命令最前端。
上一次说到Zend的词法分析,现在该轮到语法分析和中间代码生成部分了。一般情况下,词法分析和语法分析是在一起的过程,所以一般词法分析器和语法分析器是交织在一起的,共同运行。
PHP的语法分析器使用的是Bison。具体的语法分析器定义在 Zend/zend_language_parser.y文件中。
本来这篇分析是作为一次内部分享而写的,然后就懒癌发作,一直没有写完,到目前也只是写了大约三分之一吧,原因之一也是PHP深入下去还是比较复杂的。最近空闲下来,还是觉得应该把这篇都写完吧。
手动分割线===================
一段PHP脚本,到底最终是如何执行的呢?我们可以通过下面这一段最简单的代码,PHP的HelloWorld,看一步步看看到底PHP是如何执行的。
<?php
echo 'Hello ' . 'World';
echo 'Hello ', 'World';
?>
为啥要输出两次呢,当然是刻意构造好的,下面需要用的到 :-)
在Linux系统上支持对用户以及对用户组设置磁盘配额的文件系统很多,常见的Ext4文件系统对配额的支持就很好,但是如果要针对某个目录进行配额限制的话,就比较难办了。
至少在Ext4文件系统上并没有什么好的办法,有些比较hack的办法,比如使用 fuse 挂载一个目录,并在这个文件系统里实现目录级别的配额,虽然可以实现,但是问题就是 fuse 的性能要差很多。
然后调查了一下XFS,XFS文件系统支持 Project Quota 功能,通过该特性,可以支持目录级别的配额限制。