近日都于同Linux打交道,这上头基础比较软的自不得不请了本鸟哥的题看,感觉还不错。我道Linux相比windows比较累的就算是诸多事物还设为此命令来决定,当然,这为是过剩人喜欢linux的原由,比较缺少小然却功能强大。为了便利大家查找linux的连锁命令,我就是将自了解及之一声令下列举一下,仅供大家参考:

摘要: Nginx限速模块分为哪几种?按请求速率限速的burst和nodelay参数是什么意思?漏桶算法和令牌桶算法究竟发生啊两样?本文将带动你同样探究竟。我们会经有些简的以身作则展示Nginx限速模块是哪些做事之,然后成代码讲解其背后的算法和规律。

系信息 
arch 显示机器的微机架构(1) 
uname -m 显示机器的微处理器架构(2) 
uname -r 显示在采取的内核版本 
dmidecode -q 显示硬件系统部件 – (SMBIOS / DMI) 
hdparm -i /dev/hda 罗列一个磁盘的架特性 
hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 
cat /proc/cpuinfo 显示CPU info的信息 
cat /proc/interrupts 显示着断 
cat /proc/meminfo 校验内存使用 
cat /proc/swaps 显示怎么swap被运用 
cat /proc/version 显示内核的版本 
cat /proc/net/dev 显示网络适配器及统计 
cat /proc/mounts 显示已加载的文件系统 
lspci -tv 罗列 PCI 设备 
lsusb -tv 显示 USB 设备 
date 显示系统日期 
cal 2007 显示2007年的日历表 
date 041217002007.00 设置日期和时间 – 月日时分年.秒 
clock -w 将时间改保存至 BIOS 

Nginx限速模块分为哪几种?按请求速率限速的burst和nodelay参数是什么意思?漏桶算法和令牌桶算法究竟出什么不同?本文将拉动您平探究竟。我们见面通过有些概括的言传身教展示Nginx限速模块是如何做事的,然后做代码讲解其偷的算法和法则。

关机 (系统的关机、重开以及登出 ) 
shutdown -h now 关闭系统(1) 
init 0 关闭系统(2) 
telinit 0 关闭系统(3) 
shutdown -h hours:minutes & 按预约时间关闭系统 
shutdown -c 取消按约定时关闭系统 
shutdown -r now 重启(1) 
reboot 重启(2) 
logout 注销 

着力算法

当探讨Nginx限速模块之前,我们先行来看望网络传输中时时因此半单底流量控制算法:漏桶算法和令牌桶算法。这片单“桶”到底有啊异同呢?

文本和目录 
cd /home 进入 ‘/ home’ 目录’ 
cd .. 返回上一级目录 
cd ../.. 返回上一丁点儿层目录 
cd 进入个体的主目录 
cd ~user1 进入个体的主目录 
cd – 返回上次所在的目录 
pwd 显示工作路径 
ls 查看目录中的公文 
ls -F 查看目录中的文件 
ls -l 显示文件和目录的详细资料 
ls -a 显示隐藏文件 
ls *[0-9]* 显示包含数字之公文称以及目录名 
tree 显示文件和目录由穷目录开始的树形结构(1) 
lstree 显示文件和目录由穷目录开始的树形结构(2) 
mkdir dir1 创建一个曰 ‘dir1′ 的目录’ 
mkdir dir1 dir2 同时创造两个目录 
mkdir -p /tmp/dir1/dir2 创建一个目录树 
rm -f file1 删除一个号称 ‘file1′ 的公文’ 
rmdir dir1 删除一个称呼 ‘dir1′ 的目录’ 
rm -rf dir1 删除一个名叫 ‘dir1’ 的目录并以删除其情 
rm -rf dir1 dir2 同时删除两单目录和它的情节 
mv dir1 new_dir 重命名/移动 一个目录 
cp file1 file2 复制一个文书 
cp dir/* . 复制一个索引下之拥有文件及当前工作目录 
cp -a /tmp/dir1 . 复制一个目及当前工作目录 
cp -a dir1 dir2 复制一个目录 
ln -s file1 lnk1 创建一个对准文件或者目录的软链接 
ln file1 lnk1 创造一个针对性文件要目录的物理链接 
touch -t 0712250000 file1 修改一个文本要目录的年月戳 – (YYMMDDhhmm) 
file file1 outputs the mime type of the file as text 
iconv -l 列有就解的编码 
iconv -f fromEncoding -t toEncoding inputFile > outputFile creates a
new from the given input file by assuming it is encoded in fromEncoding
and converting it to toEncoding. 
find . -maxdepth 1 -name *.jpg -print -exec convert “{}” -resize 80×60
“thumbs/{}” \; batch resize files in the current directory and send
them to a thumbnails directory (requires convert from Imagemagick) 

漏桶算法(leaky bucket)

漏桶算法(leaky
bucket)算法思想如图所示:

图片 1

一个形象的解说是:

  • 和(请求)从上倒入水桶,从水桶下方流出(被处理);
  • 来不及流出的次是水桶中(缓冲),以固定速率流出;
  • 水桶满后水漫起(丢弃)。

斯算法的中坚是:缓存请求、匀速处理、多余的伸手直接丢掉。

文本搜索 
find / -name file1 从 ‘/’ 开始进入根文件系统搜索文件以及目录 
find / -user user1 搜索属于用户 ‘user1’ 的文件与目录 
find /home/user1 -name \*.bin 于目录 ‘/ home/user1′ 中寻觅带有’.bin’
结尾的公文 
find /usr/bin -type f -atime +100
搜索在过去100天外未受以了的尽文书 
find /usr/bin -type f -mtime -10 搜索于10龙外叫创造或者修改过的文书 
find / -name \*.rpm -exec chmod 755 ‘{}’ \; 搜索以 ‘.rpm’
结尾的文本并定义其权限 
find / -xdev -name \*.rpm 搜索以 ‘.rpm’
结尾的文件,忽小光驱、捷盘等可走装备 
locate \*.ps 寻找以 ‘.ps’ 结尾的公文 – 先运行 ‘updatedb’ 命令 
whereis halt 显示一个二进制文件、源码或man的职位 
which halt 显示一个二进制文件或者可执行文件的整体路径 

使牌桶算法(token bucket)

令牌桶(token
bucket)算法思想如图所示:

图片 2

算法思想是:

  • 叫牌以固定速率产生,并缓存到叫牌桶中;
  • 俾牌桶放满时,多余的令牌被抛弃;
  • 恳请而消耗相当于比例的令牌才能够让拍卖;
  • 令牌不够时,请求于缓存。

相对而言漏桶算法,令牌桶算法不同之处在于它们不光有平等特“桶”,还发只队,这个桶是故来存放令牌的,队列才是用来存放在请求的。

自从图上的话,漏桶和令牌桶算法最醒目的区别就是是是否允许突发流量(burst)的处理,漏桶算法能够强行限制数量的实时传输(处理)速率,对突如其来流量不做额外处理;而使得牌桶算法能够当限定数量的平均传输速率的又允许某种程度之爆发传输。

Nginx按请求速率限速模块使用的是漏桶算法,即能强行保证请求的实时处理速度不会见超过设置的阈值。

挂载一个文件系统 
mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 – 确定目录 ‘/ mnt/hda2’
已经存在 
umount /dev/hda2 卸载一个叫hda2的盘 – 先由挂载点 ‘/ mnt/hda2’ 退出 
fuser -km /mnt/hda2 当设备繁忙时强制卸载 
umount -n /mnt/hda2 运行卸载操作而无写副 /etc/mtab 文件-
当文件呢单读或当磁盘写满时充分有用 
mount /dev/fd0 /mnt/floppy 挂载一个软盘 
mount /dev/cdrom /mnt/cdrom 挂载一个cdrom或dvdrom 
mount /dev/hdc /mnt/cdrecorder 挂载一个cdrw或dvdrom 
mount /dev/hdb /mnt/cdrecorder 挂载一个cdrw或dvdrom 
mount -o loop file.iso /mnt/cdrom 挂载一个文件要ISO镜像文件 
mount -t vfat /dev/hda5 /mnt/hda5 挂载一个Windows FAT32文件系统 
mount /dev/sda1 /mnt/usbdisk 挂载一个usb 捷盘或闪存设备 
mount -t smbfs -o username=user,password=pass //WinClient/share
/mnt/share 挂载一个windows网络共享 

Nginx限速模块

Nginx主要发生半点种植限速措施:按连接数限速(ngx_http_limit_conn_module)、按请求速率限速(ngx_http_limit_req_module)。我们主要讲解按请求速率限速。

磁盘空间 
df -h 显示已经挂载的分区列表 
ls -lSr |more 以尺寸大小排列文件与目录 
du -sh dir1 估算目录 ‘dir1′ 已经以的磁盘空间’ 
du -sk * | sort -rn 以容量大小也根据各个显示文件和目录的大小 
rpm -q -a –qf ‘%10{SIZE}t%{NAME}n’ | sort -k1,1n
以大小也根据各个显示都装的rpm包所使用的空间 (fedora, redhat类系统) 
dpkg-query -W -f=’${Installed-Size;10}t${Package}n’ | sort -k1,1n
以大小为根据显示都设置之deb包所使用的空间 (ubuntu, debian类系统) 

仍连接数限速

本连接数限速大凡因限制单个IP(或者其他的key)同时提倡的总是数,超出这界定后,Nginx将直拒绝再多之连接。这个模块的布局于好明,详见ngx_http_limit_conn_module官方文档。

用户以及群组 
groupadd group_name 创建一个新用户组 
groupdel group_name 删除一个用户组 
groupmod -n new_group_name old_group_name 重命名一个用户组 
useradd -c “Name Surname ” -g admin -d /home/user1 -s /bin/bash user1
创建一个属 “admin” 用户组的用户 
useradd user1 创建一个初用户 
userdel -r user1 删除一个用户 ( ‘-r’ 排除主目录) 
usermod -c “User FTP” -g system -d /ftp/user1 -s /bin/nologin user1
修改用户属性 
passwd 修改口令 
passwd user1 修改一个用户的口令 (只允许root执行) 
chage -E 2005-12-31 user1 设置用户口令的失效期限 
pwck 检查 ‘/etc/passwd’ 的文件格式和语法修正以及有的用户 
grpck 检查 ‘/etc/passwd’ 的文件格式和语法修正以及在的群组 
newgrp group_name 登陆进一个新的群组以改变新创文件之预设群组 

依照请求速率限速

按照请求速率限速是乘限制单个IP(或者其它的key)发送请求的速率,超出指定速率后,Nginx将一直拒绝再多之求。采用leaky
bucket
算法实现。为深入摸底是模块,我们事先打尝试现象说于。开始之前我们先简单介绍一下该模块的安排方式,以下面的部署为条例:

http {
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
    ...
    server {
        ...
        location /search/ {
            limit_req zone=mylimit burst=4 nodelay;
        }

使用limit_req_zone着重字,我们定义了一个称为吧mylimit大小也10MB的共享内存区域(zone),用来存放限速相关的统计信息,限速的key值也二进制的IP地址($binary_remote_addr),限速上限(rate)为2r/s;接着我们用limit_req重大字用上述规则作用及/search/上。burstnodelay的意稍后解释。

下上述规则,对于/search/目录的拜访,单个IP的访问速度被限定于了2伸手求/秒,超过此界定的造访将直接被Nginx拒绝。

文本之权能 – 使用 “+” 设置权限,使用 “-” 用于取消 
ls -lh 显示权限 
ls /tmp | pr -T5 -W$COLUMNS 将终端划分成5栏显示 
chmod ugo+rwx directory1
设置目录的持有人(u)、群组(g)以及其他人(o)以朗诵(r
)、写(w)和执行(x)的权位 
chmod go-rwx directory1 删除群组(g)与其他人(o)对目录的读写执行权 
chown user1 file1 改变一个文书之拥有人属于性 
chown -R user1 directory1
改变一个目录的所有人属性并同时转改目录下所有文件之属性 
chgrp group1 file1 改变文件的群组 
chown user1:group1 file1 改变一个文本的备人数及群组属性 
find / -perm -u+s 罗列一个系中有着应用了SUID控制的文本 
chmod u+s /bin/file1 设置一个二进制文件的 SUID 位 –
运行该公文之用户为让与与主人同的权柄 
chmod u-s /bin/file1 禁用一个二进制文件的 SUID位 
chmod g+s /home/public 设置一个索引的SGID 位 – 类似SUID
,不过当下是对准目录的 
chmod g-s /home/public 禁用一个索引的 SGID 位 
chmod o+t /home/public 设置一个文书的 STIKY 位 –
只允许合法持有人去文件 
chmod o-t /home/public 禁用一个目录的 STIKY 位 

试验1——毫秒级统计

咱有如下配置:

...
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
server { 
    location / { 
        limit_req zone=mylimit;
    }
}
...

上述规则限制了每个IP访问的速度吗2r/s,并以欠规则作用为与目录。如果单个IP在老大少的工夫外并发发送多只请求,结果会如何为?

# 单个IP 10ms内并发发送6个请求
send 6 requests in parallel, time cost: 2 ms
HTTP/1.1 503 Service Temporarily Unavailable
HTTP/1.1 200 OK
HTTP/1.1 503 Service Temporarily Unavailable
HTTP/1.1 503 Service Temporarily Unavailable
HTTP/1.1 503 Service Temporarily Unavailable
HTTP/1.1 503 Service Temporarily Unavailable
end, total time cost: 461 ms

咱俩使用单个IP在10ms内发并发送了6单请求,只生1只成功,剩下的5独还为拒绝。我们安的快慢是2r/s,为什么偏偏发1单成功与否,是无是Nginx限制错了?当然不是,是为Nginx的限流统计是基于毫秒的,我们设置的快慢是2r/s,转换一下即便是500ms内单个IP只同意通过1独请求,从501ms开始才允许通过第二个请求。

图片 3

文件之特殊性能 – 使用 “+” 设置权限,使用 “-” 用于取消 
chattr +a file1 只同意以增方式读写文件 
chattr +c file1 允许这个文件能够让基本自动减/解压 
chattr +d file1 在进行文件系统备份时,dump程序将忽略这个文件 
chattr +i file1 设置成不可变的公文,不克叫删去、修改、重命名或者链接 
chattr +s file1 允许一个文本于安全地抹 
chattr +S file1
一旦应用程序对是文件实施了描写操作,使系统就将修改的结果写到磁盘 
chattr +u file1 若文件给去除,系统会允许你于今后恢复是叫删的文本 
lsattr 显示特殊之属性 

试验2——burst允许缓存处理突发请求

试验1咱们看,我们缺少日外发送了大量呼吁,Nginx按照毫秒级精度统计,超出限制的呼吁直接拒绝。这当其实状况被不休过于苛刻,真实网络环境受到求到来不是匀速的,很可能有请求“突发”的状态,也不怕是“一股子一股子”的。Nginx考虑到了这种情形,可以由此burst首要字被对突如其来请求的缓存处理,而无是直拒绝。

来拘禁咱们的布置:

...
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
server { 
    location / { 
        limit_req zone=mylimit burst=4;
    }
}
...

咱俩投入了burst=4,意思是每个key(此处是每个IP)最多允许4只突发请求的赶到。如果单个IP在10ms内发送6个请求,结果碰头如何为?

# 单个IP 10ms内发送6个请求,设置burst
send 6 requests in parallel, time cost: 2 ms
HTTP/1.1 200 OK
HTTP/1.1 503 Service Temporarily Unavailable
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
end, total time cost: 2437 ms

比实验1改成功数增加了4个,这个我们安的burst数目是一致的。具体处理流程是:1只请求被当下处理,4独请求让置于burst队列里,另外一个求于驳回。通过burst参数,我们让Nginx限流具备了缓存处理突发流量的力。

唯独要小心:burst的企图是让多余的恳求可以先放到行列里,慢慢处理。如果未加nodelay参数,队列里的伸手不见面应声处理,而是遵循rate设置的快,以毫秒级精确的快慢逐年处理。

装进和压缩文件 
bunzip2 file1.bz2 解压一个称呼 ‘file1.bz2’的文书 
bzip2 file1 压缩一个名叫 ‘file1’ 的文本 
gunzip file1.gz 解压一个名为 ‘file1.gz’的文件 
gzip file1 压缩一个叫作 ‘file1’的文书 
gzip -9 file1 最特别程度压缩 
rar a file1.rar test_file 创建一个名 ‘file1.rar’ 之包 
rar a file1.rar file1 file2 dir1 同时压缩 ‘file1’, ‘file2’ 以及目录
‘dir1’ 
rar x file1.rar 解压rar包 
unrar x file1.rar 解压rar包 
tar -cvf archive.tar file1 创建一个非压缩的 tarball 
tar -cvf archive.tar file1 file2 dir1 创建一个含了 ‘file1’, ‘file2’
以及 ‘dir1’的档案文件 
tar -tf archive.tar 显示一个包中的情节 
tar -xvf archive.tar 释放一个包 
tar -xvf archive.tar -C /tmp 将减包释放及 /tmp目录下 
tar -cvfj archive.tar.bz2 dir1 创建一个bzip2格式的缩减包 
tar -xvfj archive.tar.bz2 解压一个bzip2格式的压缩包 
tar -cvfz archive.tar.gz dir1 创建一个gzip格式的削减包 
tar -xvfz archive.tar.gz 解压一个gzip格式的减包 
zip file1.zip file1 创建一个zip格式的抽包 
zip -r file1.zip file1 file2 dir1
将几个公文和目录同时减少成一个zip格式的缩减包 
unzip file1.zip 解压一个zip格式压缩包 

实验3——nodelay降低排队时

试验2着我们看看,通过设置burst参数,我们得允许Nginx缓存处理肯定水平之爆发,多余的乞求可以先放到行列里,慢慢处理,这起及了平滑流量的来意。但是要是队列设置的比较老,请求排队的年华就会见较丰富,用户角度看来就是RT变长了,这对用户非常不自己。有什么解决办法呢?nodelay参数允许请求于排队的当儿即便即刻让拍卖,也就是说要请求能进burst队列,就见面及时吃后台worker处理,请小心,这象征burst设置了nodelay时,系统瞬间的QPS可能会见超越rate设置的阈值。nodelay参数要同burst同行使才有意图。

延续实验2的配置,我们参加nodelay选项:

...
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
server { 
    location / { 
        limit_req zone=mylimit burst=4 nodelay;
    }
}
...

单个IP 10ms内并发发送6独请求,结果如下:

# 单个IP 10ms内发送6个请求
   实验3, 设置burst和nodelay       |  实验2, 只设置burst
send 6 requests, time cost: 4 ms |  time cost: 2 ms
HTTP/1.1 200 OK                  |  HTTP/1.1 200 OK
HTTP/1.1 200 OK                  |  HTTP/1.1 503 ...
HTTP/1.1 200 OK                  |  HTTP/1.1 200 OK
HTTP/1.1 200 OK                  |  HTTP/1.1 200 OK
HTTP/1.1 503 ...                 |  HTTP/1.1 200 OK
HTTP/1.1 200 OK                  |  HTTP/1.1 200 OK
total time cost: 465 ms          |  total time cost: 2437 ms

暨实验2比照,请求成功率没变化,但是完全耗时变短了。这怎么解释为?实验2受到,有4个请求被安放burst队列当中,工作过程每隔500ms(rate=2r/s)取一个呼吁进行处理,最后一个呼吁而排队2s才见面让拍卖;实验3被,请求放入队列跟实验2凡一致的,但不同的凡,队列中之求又具备了受拍卖的身价,所以实验3着之5个请求可以视为同时开吃拍卖的,花费时间自变短了。

可要留心,虽然设置burst和nodelay能够降低突发请求的拍卖时,但是老来拘禁并无会见提高吞吐量的上限,长期吞吐量的上限是由于rate决定的,因为nodelay只能保证burst的恳求让随即处理,但Nginx会限制队列元素释放的快慢,就比如是限制了令牌桶中令牌产生的速度。

瞧此间而或会见问,加入了nodelay参数后的限速算法,到底算是哪一个“桶”,是漏桶算法还是令牌桶算法?当然还算是漏桶算法。考虑同种植情形,令牌桶算法的token为耗尽时见面怎么开啊?由于它起一个央队列,所以会将接下的求缓存下来,缓存多少受限于队列大小。但此刻缓存这些请求还有意义吗?如果server已经过载,缓存队列越来越长,RT越来越高,即使过了那个漫长请求于处理了,对用户来说呢未尝什么价值了。所以当token不敷用时,最明智的做法即是直接拒绝用户之请,这便成了漏桶算法,哈哈~

RPM 包 – (Fedora, Redhat及类似系统) 
rpm -ivh package.rpm 安装一个rpm包 
rpm -ivh –nodeeps package.rpm 安装一个rpm包要忽视依赖关系警告 
rpm -U package.rpm 更新一个rpm包但不改变其配备文件 
rpm -F package.rpm 更新一个规定已经安装的rpm包 
rpm -e package_name.rpm 删除一个rpm包 
rpm -qa 展示系统被保有都安装之rpm包 
rpm -qa | grep httpd 显示有名称被寓 “httpd” 字样的rpm包 
rpm -qi package_name 获得一个已经安装包之非常信息 
rpm -qg “System Environment/Daemons” 显示一个零部件的rpm包 
rpm -ql package_name 显示一个早已设置的rpm包提供的文本列表 
rpm -qc package_name 显示一个曾安装的rpm包提供的部署文件列表 
rpm -q package_name –whatrequires 显示和一个rpm包是依靠关系之列表 
rpm -q package_name –whatprovides 显示一个rpm包所占有的体积 
rpm -q package_name –scripts 显示在设置/删除期间所实行的脚本l 
rpm -q package_name –changelog 显示一个rpm包的改历史 
rpm -qf /etc/httpd/conf/httpd.conf 确认所为的文书由哪个rpm包所提供 
rpm -qp package.rpm -l 显示由一个尚未安装的rpm包提供的文书列表 
rpm –import /media/cdrom/RPM-GPG-KEY 导入公钥数字证书 
rpm –checksig package.rpm 认可一个rpm包的整体性 
rpm -qa gpg-pubkey 确认已经设置的所有rpm包的圆性 
rpm -V package_name 检查文件尺寸、
许可、类型、所有者、群组、MD5反省和最终修改时间 
rpm -Va 检查体系中具有已设置的rpm包- 小心用 
rpm -Vp package.rpm 确认一个rpm包还非安装 
rpm2cpio package.rpm | cpio –extract –make-directories *bin*
从一个rpm包运行可执行文件 
rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm
从一个rpm源码安装一个构建好之包 
rpmbuild –rebuild package_name.src.rpm 从一个rpm源码构建一个 rpm 包 

源码剖析

经地方的言传身教,我们班要限速模块出了肯定的认识,现在咱们深入解析代码实现。按请求速率限流模块ngx_http_limit_req_module代码位于[src/http/modules/ngx_http_limit_req_module.c
](https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit_req_module.c),900几近执代码可谓短小精悍。相关代码有一定量单主导数据结构:

  1. 吉黑树:通过红黑树记录每个节点(按照声明时指定的key)的统计信息,方便找;
  2. LRU队列:将红黑树上的节点按照最近访问时间排序,时间将近之放在队列头部,以便使LRU队列淘汰旧的节点,避免内存溢出。

立刻点儿个基本点目标存储在ngx_http_limit_req_shctx_t中:

typedef struct {
    ngx_rbtree_t                  rbtree; /* red-black tree */
    ngx_rbtree_node_t             sentinel; /* the sentinel node of red-black tree */
    ngx_queue_t                   queue; /* used to expire info(LRU algorithm) */
} ngx_http_limit_req_shctx_t;

中间除rbtree和queue之外,还有一个称呼sentinel的变量,这个变量用作红黑树的NIL节点。

该模块的中坚逻辑在函数ngx_http_limit_req_lookup()遇,这个函数主要流程是什么呢?对于每一个求:

  1. 从今根节点开始查找红黑树,找到key对应之节点;
  2. 找到后修改该点在LRU队列中之位置,表示该点最近让访过;
  3. 履行漏桶算法;
  4. 从来不找到时冲LRU淘汰,腾出空间;
  5. 变动并插入新的吉祥如意黑树节点;
  6. 履下一致长条限流规则。

流程非常鲜明,但是代码中牵扯到祥黑树、LRU队列等高等数据结构,是无是会刻画得稀复杂?好于Nginx作者功力深厚,代码写得简单易掌握,哈哈~

// 漏桶算法核心流程
ngx_http_limit_req_lookup(...){
  while (node != sentinel) {
      // search rbtree
    if (hash < node->key) { node = node->left; continue;} // 1. 从根节点开始查找红黑树
    if (hash > node->key) { node = node->right; continue;}
    rc = ngx_memn2cmp(key->data, lr->data, key->len, (size_t) lr->len);
    if (rc == 0) {// found
      ngx_queue_remove(&lr->queue); // 2. 修改该点在LRU队列中的位置,表示该点最近被访问过
      ngx_queue_insert_head(&ctx->sh->queue, &lr->queue);// 2
      ms = (ngx_msec_int_t) (now - lr->last);
      excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000; // 3. 执行漏桶算法
      if (excess < 0) 
          excess = 0;
      if ((ngx_uint_t) excess > limit->burst)
          return NGX_BUSY; // 超过了突发门限,拒绝
      if (account) {// 是否是最后一条规则
        lr->excess = excess;    
        lr->last = now;    
        return NGX_OK; // 未超过限制,通过
      }
      ...
      return NGX_AGAIN; // 6. 执行下一条限流规则
    }
    node = (rc < 0) ? node->left : node->right; // 1
  } // while
  ...
  // not found
  ngx_http_limit_req_expire(ctx, 1); // 4. 根据LRU淘汰,腾出空间
  node = ngx_slab_alloc_locked(ctx->shpool, size); // 5. 生成新的红黑树节点
  ngx_rbtree_insert(&ctx->sh->rbtree, node);// 5. 插入该节点,重新平衡红黑树
  ngx_queue_insert_head(&ctx->sh->queue, &lr->queue);
  if (account) {    
    lr->last = now; 
    lr->count = 0;
    return NGX_OK;
  }
  ...
  return NGX_AGAIN; // 6. 执行下一条限流规则
}

代码有三种植回到值,它们的意是:

  • NGX_BUSY 超过了突如其来门限,拒绝
  • NGX_OK 未超限制,通过
  • NGX_AGAIN 未过限定,但是还有规则不实行,需实行下一样漫长限流规则

上述代码不难理解,但我们还有几个问题:

  1. LRU是何等实现的?
  2. 漏桶算法是何许兑现之?
  3. 每个key相关的burst队排在何?

YUM 软件包升级器 – (Fedora, RedHat及类似系统) 
yum install package_name 下载并设置一个rpm包 
yum localinstall package_name.rpm
将装一个rpm包,使用你协调的软件仓库为您解决所有乘关系 
yum update package_name.rpm 更新当前网被负有安装之rpm包 
yum update package_name 更新一个rpm包 
yum remove package_name 删除一个rpm包 
yum list 列出当下网受到设置的具有包 
yum search package_name 于rpm仓库中找软件包 
yum clean packages 清理rpm缓存删除下载的包 
yum clean headers 删除所有头文件 
yum clean all 删除所有缓存的包和头文件 

LRU是什么样实现的

LRU算法的贯彻深粗略,如果一个节点被看了,那么尽管把它换到行列的头颅,当空间欠缺需要淘汰节点时,就选出队列尾部底节点淘汰掉,主要反映于如下代码中:

ngx_queue_remove(&lr->queue); // 2. 修改该点在LRU队列中的位置,表示该点最近被访问过
ngx_queue_insert_head(&ctx->sh->queue, &lr->queue);// 2
...
ngx_http_limit_req_expire(ctx, 1); // 4. 根据LRU淘汰,腾出空间

DEB 包 (Debian, Ubuntu 以及近似系统) 
dpkg -i package.deb 安装/更新一个 deb 包 
dpkg -r package_name 于网除去一个 deb 包 
dpkg -l 显示系统受存有已设置的 deb 包 
dpkg -l | grep httpd 显示所有名称中蕴含 “httpd” 字样的deb包 
dpkg -s package_name 获得已装于网受到一个异常包的信息 
dpkg -L package_name 显示系统被一度装的一个deb包所提供的文书列表 
dpkg –contents package.deb 显示没有安装之一个包所提供的文件列表 
dpkg -S /bin/ping 确认所被的文书由哪个deb包供 

漏桶算法是怎贯彻之

漏桶算法的兑现呢正如咱想像的粗略,其中心是即时同实行公式excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000,这样代码的意思是:excess表示目前key上遗留的乞求数,本次遗留的呼吁数
= 上次留的伸手数 – 预设速率 X 过去的年华 +
1
。这个1代表手上以此请,由于Nginx内部表示以单位压缩了1000加倍,所以1单请求而转换成1000。

excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000; // 3. 执行漏桶算法
if (excess < 0) 
    excess = 0;
if ((ngx_uint_t) excess > limit->burst)
    return NGX_BUSY; // 超过了突发门限,拒绝
if (account) { // 是否是最后一条规则
    lr->excess = excess;    
    lr->last = now;    
    return NGX_OK; // 未超过限制,通过
}
...
return NGX_AGAIN; // 6. 执行下一条限流规则

上述代码受限算出当前key上残留的求数,如果超过了burst,就一直拒绝;由于Nginx允许多长长的限速规则以由作用,如果既是最后一长规则,则允许通过,否则执行下一样漫漫规则。

APT 软件工具 (Debian, Ubuntu 以及近似系统) 
apt-get install package_name 安装/更新一个 deb 包 
apt-cdrom install package_name 于光盘安装/更新一个 deb 包 
apt-get update 升级列表中之软件包 
apt-get upgrade 升级有都安装之软件 
apt-get remove package_name 于系统除去一个deb包 
apt-get check 确认因之软件仓库正确 
apt-get clean 从下载的软件包被清理缓存 
apt-cache search searched-package 返回包含所设找字符串的软件包号 

单个key相关的burst队排在哪

不曾单个key相关的burst队列。上面代码中我们来看当到最终一漫长规则时,只要excess<limit->burst限速模块就见面回到NGX_OK,并没有拿剩下请求放入队列的操作,这是以Nginx是因timer来管理要的,当限速模块返回NGX_OK时,调度函数会计算一个缓处理的时日,同时将此要放入到共享的timer队列中(一蔸按等待时打小至不行排序的瑞黑树)。

ngx_http_limit_req_handler(ngx_http_request_t *r)
{
    ...
    for (n = 0; n < lrcf->limits.nelts; n++) {
        ...
        ngx_shmtx_lock(&ctx->shpool->mutex);// 获取锁
        rc = ngx_http_limit_req_lookup(limit, hash, &key, &excess, // 执行漏桶算法
                                       (n == lrcf->limits.nelts - 1));
        ngx_shmtx_unlock(&ctx->shpool->mutex);// 释放锁
        ...
        if (rc != NGX_AGAIN)
            break;
    }
    ...
    delay = ngx_http_limit_req_account(limits, n, &excess, &limit);// 计算当前请求需要的延迟时间
    if (!delay) {
        return NGX_DECLINED;// 不需要延迟,交给后续的handler进行处理
    }
    ...
    ngx_add_timer(r->connection->write, delay);// 否则将请求放到定时器队列里
    return NGX_AGAIN; // the request has been successfully processed, the request must be suspended until some event. http://www.nginxguts.com/2011/01/phases/
}

咱视ngx_http_limit_req_handler()调用了函数ngx_http_limit_req_lookup(),并因那返回回值决定如何操作:或是拒绝,或是交给下一个handler处理,或是将请放入定期器队列。当限速规则都由此后,该hanlder通过调用函数ngx_http_limit_req_account()查获当前恳请需要之延迟时间,如果未需要延期,就以请提交后续之handler进行处理,否则用呼吁放到定时器队列里。注意是定时器队列是共享的,并没有呢单独的key(比如,每个IP地址)设置队列。关于handler模块背景知识的介绍,可参看Tengine团队编著之Nginx开发从入门到精通

至于按请求速率限速的规律教学,可参看Rate Limiting with NGINX and NGINX
Plus,关于源码更详尽的分析只是参考ngx_http_limit_req_module
源码分析以及y123456yz的Nginx源码分析的git项目

翻开文件内容 
cat file1 从第一单字节开始正向查看文件之情节 
tac file1 从最后一推行开始倒朝查看一个文件的内容 
more file1 查看一个添加文件之情节 
less file1 类似于 ‘more’
命令,但是它们同意以文书被同正向操作一样的反向操作 
head -2 file1 查看一个文书的前头少尽 
tail -2 file1 查看一个文本之末段两实行 
tail -f /var/log/messages 实时翻看被填补加至一个文本被的情 

结尾

本文主要教授了Nginx按请求速率限速模块的用法及规律,其中burst和nodelay参数是便于惹误解的,虽然只是通过burst允许缓存处理突发请求,结合nodelay能够降低突发请求的拍卖时,但是老来拘禁她们并无会见提高吞吐量的上限,长期吞吐量的上限是由于rate决定的。需要特别注意的凡,burst设置了nodelay时,系统瞬间底QPS可能会见过rate设置的阈值。

正文只是针对Nginx管中窥豹,更多关于Nginx介绍的篇章,可参考Tengine团队作之Nginx开发从入门到精通。

文本处理 
cat file1 file2 … | command <> file1_in.txt_or_file1_out.txt
general syntax for text manipulation using PIPE, STDIN and STDOUT 
cat file1 | command( sed, grep, awk, grep, etc…) > result.txt
合并一个文书之事无巨细说明文本,并将简介写入一个初文件中 
cat file1 | command( sed, grep, awk, grep, etc…) >> result.txt
合并一个文件之详尽说明文本,并拿简介写入一个既有的文件被 
grep Aug /var/log/messages 在文件
‘/var/log/messages’中搜索关键词”Aug” 
grep ^Aug /var/log/messages 在文件
‘/var/log/messages’中追寻以”Aug”开始之词汇 
grep [0-9] /var/log/messages 选择 ‘/var/log/messages’
文件被有包含数字之行 
grep Aug -R /var/log/* 在目录 ‘/var/log’
同随后的目中检索字符串”Aug” 
sed ‘s/stringa1/stringa2/g’ example.txt 将example.txt文件中之 “string1”
替换成 “string2” 
sed ‘/^$/d’ example.txt 从example.txt文件中除去所有空白行 
sed ‘/ *#/d; /^$/d’ example.txt
从example.txt文件中删去所有注释和空白行 
echo ‘esempio’ | tr ‘[:lower:]’ ‘[:upper:]’ 合并上下单元格内容 
sed -e ‘1d’ result.txt 从文件example.txt 中清除第一行 
sed -n ‘/stringa1/p’ 查看只包含词汇 “string1″的行 
sed -e ‘s/ *$//’ example.txt 删除每一行最后之空白字符 
sed -e ‘s/stringa1//g’ example.txt 从文档中不过去词汇 “string1”
并保存盈余全部 
sed -n ‘1,5p;5q’ example.txt 查看从第一实施至第5实施内容 
sed -n ‘5p;5q’ example.txt 查看第5行 
sed -e ‘s/00*/0/g’ example.txt 用么零替换多独零 
cat -n file1 标示文件之行数 
cat example.txt | awk ‘NR%2==1’ 删除example.txt文件中之所有偶数行 
echo a b c | awk ‘{print $1}’ 查看一行首先栏 
echo a b c | awk ‘{print $1,$3}’ 查看一行的率先和老三棚 
paste file1 file2 合并两单文本或者零星牢的情节 
paste -d ‘+’ file1 file2 合并两单公文或者少数栏的情节,中间用”+”区分 
sort file1 file2 排序两只文本之情节 
sort file1 file2 | uniq 取出两单文本之并集(重复的实行就保留一份) 
sort file1 file2 | uniq -u 删除交集,留下任何的行 
sort file1 file2 | uniq -d
取出点儿个公文的混(只留同时在叫个别只文本中之文书) 
comm -1 file1 file2 比较简单个文件之始末只有去 ‘file1’ 所涵盖的情节 
comm -2 file1 file2 比较单薄独文件的情仅去 ‘file2’ 所蕴涵的始末 
comm -3 file1 file2 比较有限只文件之情节仅仅去两独文本共有的组成部分 

字符设置以及文件格式转换 
dos2unix filedos.txt fileunix.txt
将一个文件文件之格式从MSDOS转换成UNIX 
unix2dos fileunix.txt filedos.txt
拿一个文件文件之格式从UNIX转换成MSDOS 
recode ..HTML < page.txt > page.html 将一个文本文件转换成为html 
recode -l | more 显示所有允许的更换格式 

文件系统分析 
badblocks -v /dev/hda1 检查磁盘hda1达标之坏磁块 
fsck /dev/hda1 修复/检查hda1磁盘上linux文件系统的完好性 
fsck.ext2 /dev/hda1 修复/检查hda1磁盘上ext2文件系统的整性 
e2fsck /dev/hda1 修复/检查hda1磁盘上ext2文件系统的总体性 
e2fsck -j /dev/hda1 修复/检查hda1磁盘上ext3文件系统的一体化性 
fsck.ext3 /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完全性 
fsck.vfat /dev/hda1 修复/检查hda1磁盘上fat文件系统的整体性 
fsck.msdos /dev/hda1 修复/检查hda1磁盘上dos文件系统的圆性 
dosfsck /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性 

初始化一个文件系统 
mkfs /dev/hda1 在hda1区划区创建一个文件系统 
mke2fs /dev/hda1 在hda1划分区创建一个linux ext2的文件系统 
mke2fs -j /dev/hda1 在hda1分割区创建一个linux ext3(日志型)的文件系统 
mkfs -t vfat 32 -F /dev/hda1 创建一个 FAT32 文件系统 
fdformat -n /dev/fd0 格式化一个软盘 
mkswap /dev/hda3 创建一个swap文件系统 

SWAP文件系统 
mkswap /dev/hda3 创建一个swap文件系统 
swapon /dev/hda3 启用一个新的swap文件系统 
swapon /dev/hda2 /dev/hdb3 启用两独swap分区 

备份 
dump -0aj -f /tmp/home0.bak /home 制作一个 ‘/home’ 目录的整备份 
dump -1aj -f /tmp/home0.bak /home 制作一个 ‘/home’ 目录的交互式备份 
restore -if /tmp/home0.bak 还原一个交互式备份 
rsync -rogpav –delete /home /tmp 同步两边的目录 
rsync -rogpav -e ssh –delete /home ip_address:/tmp 通过SSH通道rsync 
rsync -az -e ssh –delete ip_addr:/home/public /home/local
通过ssh和减少将一个远距离目录并到地头目录 
rsync -az -e ssh –delete /home/local ip_addr:/home/public
通过ssh和削减将地面目录并到长途目录 
dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr ‘dd of=hda.gz’
通过ssh在远距离主机上执行同样坏备份本地磁盘的操作 
dd if=/dev/sda of=/tmp/file1 备客磁盘内容到一个文书 
tar -Puf backup.tar /home/user 执行同一软对 ‘/home/user’
目录的交互式备份操作 
( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr ‘cd /home/share/ &&
tar x -p’ 通过ssh在远距离目录中复制一个索引内容 
( tar c /home ) | ssh -C user@ip_addr ‘cd /home/backup-home && tar x
-p’ 通过ssh在远距离目录中复制一个本土目录 
tar cf – . | (cd /tmp/backup ; tar xf – )
本地将一个目录复制到任何一个地方,保留老权限和链接 
find /home/user1 -name ‘*.txt’ | xargs cp -av
–target-directory=/home/backup/ –parents 从一个目录查找并复制所有因
‘.txt’ 结尾的文书及外一个目录 
find /var/log -name ‘*.log’ | tar cv –files-from=- | bzip2 >
log.tar.bz2 摸所有坐 ‘.log’ 结尾的文件并做成一个bzip包 
dd if=/dev/hda of=/dev/fd0 bs=512 count=1 做一个拿 MBR (Master Boot
Record)内容复制到软盘的动作 
dd if=/dev/fd0 of=/dev/hda bs=512 count=1
从已经保存至软盘的备份中还原MBR内容 

光盘 
cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force
清空一个可复写的光盘内容 
mkisofs /dev/cdrom > cd.iso 在磁盘上创设一个光盘的iso镜像文件 
mkisofs /dev/cdrom | gzip > cd_iso.gz
在磁盘上创立一个滑坡了之光盘iso镜像文件 
mkisofs -J -allow-leading-dots -R -V “Label CD” -iso-level 4 -o ./cd.iso
data_cd 创建一个索引的iso镜像文件 
cdrecord -v dev=/dev/cdrom cd.iso 刻录一个ISO镜像文件 
gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom –
刻录一个精减了底ISO镜像文件 
mount -o loop cd.iso /mnt/iso 挂载一个ISO镜像文件 
cd-paranoia -B 从一个CD光盘转录音轨到 wav 文件被 
cd-paranoia — “-3” 从一个CD光盘转录音轨到 wav 文件被(参数-3) 
cdrecord –scanbus 扫描总线以识别scsi通道 
dd if=/dev/hdc | md5sum 校验一个设施的md5sum编码,例如一摆放 CD 

纱 – (以太网和WIFI无线) 
ifconfig eth0 显示一个以太网卡的配置 
ifup eth0 启用一个 ‘eth0’ 网络设施 
ifdown eth0 禁用一个 ‘eth0’ 网络设施 
ifconfig eth0 192.168.1.1 netmask 255.255.255.0 控制IP地址 
ifconfig eth0 promisc 设置 ‘eth0’ 成混杂模式因为嗅探数据包 (sniffing) 
dhclient eth0 以dhcp模式启用 ‘eth0’ 
route -n show routing table 
route add -net 0/0 gw IP_Gateway configura default gateway 
route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 configure
static route to reach network ‘192.168.0.0/16’ 
route del 0/0 gw IP_gateway remove static route 
echo “1” > /proc/sys/net/ipv4/ip_forward activate ip routing 
hostname show hostname of system 
host www.example.com lookup hostname to resolve name to ip address and
viceversa(1) 
nslookup www.example.com lookup hostname to resolve name to ip address
and viceversa(2) 
ip link show show link status of all interfaces 
mii-tool eth0 show link status of ‘eth0’ 
ethtool eth0 show statistics of network card ‘eth0’ 
netstat -tup show all active network connections and their PID 
netstat -tupl show all network services listening on the system and
their PID 
tcpdump tcp port 80 show all HTTP traffic 
iwlist scan show wireless networks 
iwconfig eth1 show configuration of a wireless network card 
hostname show hostname 
host www.example.com lookup hostname to resolve name to ip address and
viceversa 
nslookup www.example.com lookup hostname to resolve name to ip address
and viceversa 
whois www.example.com lookup on Whois database 

GO TOP INDEX ^ 
Microsoft Windows networks (SAMBA) 
nbtscan ip_addr netbios name resolution 
nmblookup -A ip_addr netbios name resolution 
smbclient -L ip_addr/hostname show remote shares of a windows host 
smbget -Rr smb://ip_addr/share like wget can download files from a host
windows via smb 
mount -t smbfs -o username=user,password=pass //WinClient/share
/mnt/share mount a windows network share

转折呼吁标明出处:http://www.cnblogs.com/fnlingnzb-learner/p/5831284.html 谢谢。