hb-lee 的博客


  • Home

  • Archives

Ceph集群使用---常用命令

Posted on 2019-07-08

Ceph集群使用—常用命令

背景知识

ceph中的pool、PG、OSD的关系

Pool每个pool是逻辑上的隔离单位,不同的pool可以有完全不一样的数据处理方式,它规定了数据冗余的类型和对应的副本分布策略;支持两种类型:副本(replicated)和 纠删码( Erasure Code)
PG( placement group)是一个放置策略组,它是对象的集合,该集合里的所有对象都具有相同的放置策略;简单点说就是相同PG内的对象都会放到相同的硬盘上; PG是 ceph的核心概念, 服务端数据均衡和恢复的最小粒度就是PG;
OSD是负责物理存储的进程,一般配置成和磁盘一一对应,一块磁盘启动一个OSD进程;
关系如下:

  • 一个Pool里有很多PG
  • 一个PG里包含一堆对象;一个对象只能属于一个PG
  • PG有主从之分,一个PG分布在不同的OSD上(针对三副本类型)

下图来区别:

Ceph架构

其架构如下;

常用命令

sudo ceph health  查看健康状况
sudo ceph -s  查看集群状况
sudo ceph osd tree  查看OSD信息
pool
1
sudo ceph osd pool create lhbpool 128 128

创建名为lhbpool的pool,这个pool中的pg,pgp都为128;

1
sudo ceph osd pool get lhbpool pg_num

获取pg_num,或pgp_num的大小;

1
sudo ceph osd pool rename rlhbpool lhbpool

重命名pool

1
ceph osd pool set-quota test-pool max_objects 100

设置允许最大object数量为100
取消配额限制只需要把对应值设为0即可。

1
ceph osd pool set-quota test-pool max_bytes $((10 * 1024 * 1024 * 1024))

设置允许容量限制为10GB
取消配额限制只需要把对应值设为0即可。

1
sudo ceph osd lspools

打印pool列表

1
ceph osd pool delete test-pool test-pool  --yes-i-really-really-mean-it

删除pool,删除一个pool会同时清空pool的所有数据,因此非常危险。(和rm -rf /类似)。因此删除pool时ceph要求必须输入两次pool名称,同时加上–yes-i-really-really-mean-it选项。

1
sudo rados df

查看pool状态信息

1
ceph osd pool set/get {pool-name} {key} {value}

通过上述语法设置获取pool的元数据

1
ceph osd pool set test-pool size 3

设置pool的冗余副本数量为3

Crush MAP 相关
  • 获取现有集群的crush map
1
sudo ceph osd getcrushmap -o crush.map

为二进制文件,需要反编译;反编译命令为:crushtool -d crush.map -o crushmap-decompile

  • 运用新的crush map
    当你修改了crush map后需要编译,如下命令:
1
crushtool -c crushmap-decompile -o crush.map

接着设置到集群中,用如下命令:

1
sudo ceph osd setcrushmap -i crush.map
Ceph 管理接口 (radosgw-admin)
  • 列出所有用户
1
radosgw-admin metadata list user

还可以列出桶:radosgw-admin metadata list bucket

  • 创建用户
1
sudo radosgw-admin user create --uid="lhb" --display-name="First User"

sudo radosgw-admin user create

  • 显示用户信息,以及可能存在的子用户和密钥
1
sudo radosgw-admin user info --uid=testuser

sudo radosgw-admin user info

  • 显示配额子系统统计的用户状态
1
sudo radosgw-admin user stats --uid=testuser

sudo radosgw-admin user stats

  • 其他功能
1
2
3
4
5
6
7
user rm  删除用户
user suspend 暂停某用户
user enable 重新允许暂停的用户
user check 检查用户信息
bucket list 罗列所有桶
bucket rm 删除一个桶
……

ref: http://docs.ceph.org.cn/man/8/radosgw-admin/

总结

摘自某处的一个图,是相关命令的总结,如下:

另外还有一个知识树:

Ceph环境搭建 (Debian发行版为例)

Posted on 2019-07-08

Ceph环境搭建 (Debian发行版为例)

ref:http://docs.ceph.com/docs/master/start

注:一个ceph存储集群需要至少一个Ceph Monitor和至少两个Ceph OSD Daemons

安装前的了解

安装版本

L版本安装:echo deb http://download.ceph.com/debian-luminous/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list

普通用户免密码sudo设置
1
2
3
4
su root
chmod u+w /etc/sudoers
vim /etc/sudoers
添加 lihongbo01 ALL=(ALL) NOPASSWD: ALL这一行,替换`lihongbo01`为你的用户名即可;
ssh默认端口号问题 (不是22)

解决方案:编辑~/.ssh/config文件,内容如下:

1
2
3
4
5
6
7
8
9
10
Port 32200
Host cld-unknown212867
Hostname cld-unknown212867
User lihongbo01
Host cld-unknown212868
Hostname cld-unknown212868
User lihongbo01
Host cld-unknown212869
Hostname cld-unknown212869
User lihongbo01

安装步骤 <在此之前请配置好免密登录和节点时间同步,参考官网Pre-flight>

wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -
echo deb http://download.ceph.com/debian-{ceph-stable-release}/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list 【版本如:luminous】
sudo apt-get update && sudo apt-get install ceph-deploy

1.注意:debian安装mimic版本时,用ceph-deploy安装不能安装到最新的,只能安装到Candidate: 10.2.11-2的,可以通过apt-cache policy ceph-common查看;而lumious可以安装到12.2.10。

2.软件不知道怎么安装可以用: apt-file search xxx

接着执行:

mkdir my-cluster
cd my-cluster
ceph-deploy new cld-unknown212867
vim ceph.conf
添加:osd pool default size = 2 ## 放到ceph.conf中修改副本数为2
ceph-deploy install --release luminous cld-unknown212867 cld-unknown212868 cld-unknown212869
ceph-deploy mon create-initial
ceph-deploy admin cld-unknown212867 cld-unknown212868 cld-unknown212869
ceph-deploy mgr create cld-unknown212867 *Required only for luminous+ builds, i.e >= 12.x builds*
1. 以loop来做虚拟盘<考虑到当前节点没有额外盘> —- 失败

接着我们来添加OSDs,我们首先虚拟一个块设备(用dd命令):

dd if=/dev/zero of=1G.img bs=1M count=1000  # OSD节点上虚拟一个1G的块设备
ceph-deploy osd create --data /home/lihongbo01/dev/1G.img cld-unknown212868 【MON节点上执行的】

经过多次尝试,用loop来做设备失败。 【可能还没有完全支持】

2. 【添加盘后添加OSD成功】 —- 成功
ceph-deploy osd create --data /dev/vdd cld-unknown212868 
ceph-deploy osd create --data /dev/vdd cld-unknown212869

创建OSD时最终会调用ceph-volume,这时--data已经不能是目录了,而须一个disk,可参见问题部分查看disk.py代码来理解。

查看成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
lihongbo01@cld-unknown212867:~/my-cluster$ sudo ceph health
HEALTH_OK
lihongbo01@cld-unknown212867:~/my-cluster$ sudo ceph -s
cluster:
id: 67170b2c-c545-4efb-80cb-810256529f34
health: HEALTH_OK

services:
mon: 1 daemons, quorum cld-unknown212867
mgr: cld-unknown212867(active)
osd: 2 osds: 2 up, 2 in

data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 2.00GiB used, 98.0GiB / 100GiB avail
pgs:

一定要加sudo查看

中途安装失败删除命令:
1
2
3
4
ceph-deploy purge {ceph-node} [{ceph-node}]
ceph-deploy purgedata {ceph-node} [{ceph-node}]
ceph-deploy forgetkeys
rm ceph.*

注意要加上–release luminous才会安装该版本的,不然就安装默认的了,当前ceph-deploy是2.0.1版本,Debian上默认安装Ceph是10.2.11版本的。



以下是以loop虚拟设备来做OSD时遇到的问题即解决方法:

问题

添加OSD不成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
[node4][DEBUG ]  stderr: 12: (main()+0x2c58) [0x7f8e8dc18c18]
[node4][DEBUG ] stderr: 13: (__libc_start_main()+0xf5) [0x7f8e808c03d5]
[node4][DEBUG ] stderr: 14: (()+0x384ab0) [0x7f8e8dcf0ab0]
[node4][DEBUG ] stderr: NOTE: a copy of the executable, or `objdump -rdS <executable>` is needed to interpret this.
[node4][DEBUG ] --> Was unable to complete a new OSD, will rollback changes
[node4][DEBUG ] Running command: /bin/ceph --cluster ceph --name client.bootstrap-osd --keyring /var/lib/ceph/bootstrap-osd/ceph.keyring osd purge-new osd.3 --yes-i-really-mean-it
[node4][DEBUG ] stderr: purged osd.3
[node4][ERROR ] RuntimeError: command returned non-zero exit status: 1
[ceph_deploy.osd][ERROR ] Failed to execute command: /usr/sbin/ceph-volume --cluster ceph lvm create --bluestore --data /dev/sdc --block.wal /dev/sdb2 --block.db /dev/sdb1
[ceph_deploy][ERROR ] GenericError: Failed to create 1 OSDs

修复:
node节点卸载挂载分区
[root@node4 ~]# umount /var/lib/ceph/osd/ceph-3
查看lvs

[root@node4 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
osd-block-ab4df89f-8682-4233-b683-e05c161089a4 ceph-183df03c-83fb-441c-a82e-d7b560e1a611 -wi-a----- 50.00g
root cl -wi-ao---- 35.12g
swap cl -wi-ao---- 3.88g

删除lv,vg,pv
[root@node4 ~]# lvremove osd-block-ab4df89f-8682-4233-b683-e05c161089a4 ceph-183df03c-83fb-441c-a82e-d7b560e1a611
Volume group "osd-block-ab4df89f-8682-4233-b683-e05c161089a4" not found
Cannot process volume group osd-block-ab4df89f-8682-4233-b683-e05c161089a4
Do you really want to remove active logical volume ceph-183df03c-83fb-441c-a82e-d7b560e1a611/osd-block-ab4df89f-8682-4233-b683-e05c161089a4? [y/n]: y
Logical volume "osd-block-ab4df89f-8682-4233-b683-e05c161089a4" successfully removed

[root@node4 ~]# vgremove ceph-183df03c-83fb-441c-a82e-d7b560e1a611
Volume group "ceph-183df03c-83fb-441c-a82e-d7b560e1a611" successfully removed

[root@node4 ~]# pvremove /dev/sdc
Labels on physical volume "/dev/sdc" successfully wiped.

删除/var/lib/ceph/osd/ 所有
[root@node4 ~]# rm /var/log/ceph/ceph-* -rf

删除 ceph 日志
[root@node4 ~]# rm -rf /var/lib/ceph/*

monitor1 上重置node4 的sdc分区
[root@monitor1 ceph-cluster]# ceph-deploy disk zap node4 /dev/sdc

monitor1 上重新创建osd节点
[root@monitor1 ceph-cluster]# ceph-deploy osd create node4 --bluestore --data /dev/sdc --block-db /dev/sdb1 --block-wal /dev/sdb2

【实践失败】

loop设备做块设备

需要修改两处:

1
2
vim /usr/lib/python2.7/dist-packages/ceph_volume/util/disk.py +332  修改为:return TYPE == 'disk' or 'loop'
vim /usr/lib/python2.7/dist-packages/ceph_volume/util/disk.py +417 True ==> False

ref:https://www.netways.de/blog/2018/11/14/ceph-mimic-using-loop-devices-as-osd/

清理操作

sudo lvs (vgscan)
sudo vgremove ceph-9eee83f3-8b17-4b3f-b53e-62bf4977733b -y
lsblk



华丽的分割线


Ceph对象网关部署 (可部署多个)

使用命令在 Ceph 对象网关节点上新建一个 Ceph对象网关实例:

1
ceph-deploy rgw create cld-unknown212868

需要开放7480端口:iptables -I INPUT 1 -p tcp -m tcp –dport 7480 -j ACCEPT

测试及效果:

1
2
3
4
5
6
7
8
9
10
11
curl http://cld-unknown212868:7480

<?xml version="1.0" encoding="UTF-8"?>
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Owner>
<ID>anonymous</ID>
<DisplayName></DisplayName>
</Owner>
<Buckets>
</Buckets>
</ListAllMyBucketsResult>

即表示安装成功。

创建S3用户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
lihongbo01@cld-unknown212867:~/my-cluster$ sudo radosgw-admin user create --uid="lhb" --display-name="First User"
{
"user_id": "lhb",
"display_name": "First User",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"auid": 0,
"subusers": [],
"keys": [
{
"user": "lhb",
"access_key": "KSOF3PIEDDNI7KP4I1HC",
"secret_key": "f6N9wvBWbfviV0R5TaGUHYCXZKWCTfmMPDIQf4hF"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw"
}

目前只能使用path-style来访问,hosted-style需要另外配置。

修改了配置文件(如网关端口号)
ceph-deploy --overwrite-conf config push <gateway-node> [<other-nodes>] # 将该配置文件推送到你的 Ceph 对象网关节点
sudo service radosgw restart id=rgw.<short-hostname>  # 重启Ceph对象网关
提供泛域名解析能力

Ceph对象存储网关支持两种访问模式:path-style和host-style;默认的支持path-style,即http://cld-unknown212868/bucket;要想以类似S3的host-style进行访问,即用http://bucket.cld-unknown212868/obj来进行访问,需要配置泛域名解析,此处用到dnsmasq工具。

sudo apt-get install dnsmasq -y
vim /etc/resolv.conf    【改为:nameserver 127.0.0.1】
vim /etc/resolv.dnsmasq.conf    【将原来resolv.conf的内容写在这个文件里面】

接着编辑dnsmqsq配置文件,在/etc/dnsmasq.conf中加入一下内容:

1
2
3
4
5
address=/.cld-unknown212868/10.202.42.147
address=/.cld-unknown212868.i.nease.net/10.202.42.147
resolv-file=/etc/resolv.dnsmasq.conf
conf-dir=/etc/dnsmasq.d
conf-dir=/etc/dnsmasq.d/,*.conf

此配置的含义是将xxx.cld-unknown212868的路径都转到10.202.42.147这个地址;

然后重启dnsmasq服务:/etc/init.d/dnsmasq restart

效果
1
2
3
4
5
6
7
8
9
10
lihongbo01@cld-unknown212868:~/workspace/ceph_workspace$ ping bucket.cld-unknown212868
PING bucket.cld-unknown212868 (10.202.42.147) 56(84) bytes of data.
64 bytes from cld-unknown212868.i.nease.net (10.202.42.147): icmp_seq=1 ttl=64 time=0.045 ms
64 bytes from cld-unknown212868.i.nease.net (10.202.42.147): icmp_seq=2 ttl=64 time=0.064 ms
64 bytes from cld-unknown212868.i.nease.net (10.202.42.147): icmp_seq=3 ttl=64 time=0.065 ms
64 bytes from cld-unknown212868.i.nease.net (10.202.42.147): icmp_seq=4 ttl=64 time=0.043 ms
^C
--- bucket.cld-unknown212868 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3075ms
rtt min/avg/max/mdev = 0.043/0.054/0.065/0.011 ms

tmux:一个神奇的Linux工具

Posted on 2019-05-23

tmux简介

tmux是Linux上的终端复用神器,可以实现一个屏幕管理多个终端,类似一个虚拟的远程连接,通过一个终端,可以维持多个连接会话;

tmux安装

Ubuntu上: apt-get install tmux
Centos上: yum install tmux

tmux常用命令

tmux new -s mysession    创建名为mysession的会话
tmux ls    显示会话列表
tmux a    连接上一个会话
tmux a -t mysession    连接指定会话
tmux rename -t s1 s2    重命名会话s1为s2
tmux kill-session    关闭上次打开的会话
tmux kill-session -t s1    关闭会话s1
tmux kill-session -a -t s1    关闭除s1外的所有会话
tmux kill-server    关闭所有会话

Gramfs安装指南

Posted on 2019-05-21

依赖的库及下载地址

glog    [https://github.com/hb-lee/attachment/glog-0.3.3.tar.gz]
gflag    [https://github.com/gflags/gflags]
kyotocabinet    [https://github.com/hb-lee/attachment/kyotocabinet-1.2.77.tar.gz]
boost_system    [https://github.com/hb-lee/attachment/boost_1_53_0.tar.gz]
boost_serialization    [https://github.com/hb-lee/attachment/boost_1_53_0.tar.gz]
thrift    [https://github.com/hb-lee/attachment/thrift-0.12.0.tar.gz]

cmake安装

wget https://cmake.org/files/v3.14/cmake-3.14.0.tar.gz
tar -xvf cmake-3.14.0.tar.gz
cd cmake-3.14.0.tar.gz
./configure
make && make install
cd -

glog安装

tar -xvf glog-0.3.3.tar.gz
cd glog-0.3.3.tar.gz
./configure
make && make install
cd -

gflag安装

git clone https://github.com/gflags/gflags
cd gflags
cmake .
make -j 24
make install
cd -

kyotocabinet安装

tar xvf kyotocabinet-1.2.77.tar.gz
cd kyotocabinet-1.2.77
./configure
make && make install
cd -

thrift安装

yum -y groupinstall "Development Tools"
sudo yum -y install libevent-devel zlib-devel openssl-devel

openssl-devel若出现依赖导致安装不了,可以用源码包进行安装(提供包openssl-1.1.1b.tar.gz)

wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar xvf autoconf-2.69.tar.gz
./configure --prefix=/usr
make
sudo make install
cd ..

wget http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz
tar xvf automake-1.14.tar.gz
cd automake-1.14
./configure --prefix=/usr
make
sudo make install
cd ..

wget http://ftp.gnu.org/gnu/bison/bison-2.5.1.tar.gz
tar xvf bison-2.5.1.tar.gz
cd bison-2.5.1
./configure --prefix=/usr
make
sudo make install
cd ..

wget http://sourceforge.net/projects/boost/files/boost/1.53.0/boost_1_53_0.tar.gz
tar xvf boost_1_53_0.tar.gz
cd boost_1_53_0
./bootstrap.sh
sudo ./b2 install
cd ..

wget http://mirrors.hust.edu.cn/apache/thrift/0.12.0/thrift-0.12.0.tar.gz
tar xvf thrift-0.12.0.tar.gz
cd thrift
./configure --with-lua=no
make
make && make install

遇到的棘手问题

gcc升级问题:

  • g++: fatal error: braced spec is invalid at ‘%’

    env -i PATH=/bin:/usr/bin make [可能试一下环境变量导致的,用此命令来暂时还原最原始的环境变量] 首先得换高阶的gcc

共享库编译问题

  • relocation R_X86_64_32S against `XXXXXXX’ can not be used when making a shared object; recompile with -fPIC

    网上都显示这个问题是由于没有加-fPIC编译选项导致的,但是亲自尝试后并不是这样,加了也报这个错误;后来发现是由于代码里有static函数,共享库里不能有static,自己理解是shared里地址不能固定,而static放在常量区,将static改掉就可以了;

RAID一些研究 (RAID on SSD)

Posted on 2019-03-11

总结

当机器学习进入系统

Posted on 2019-01-03

组会报告 12.25

并行优化与CUDA编程基础

Posted on 2018-11-30

组会报告 11.29
















blktrace 分析不同负载在各种文件系统下的磁盘访问情况

Posted on 2018-11-29

###组会汇报 2018.11.1

















linux服务器上设置网络代理

Posted on 2018-11-02

PS:本文针对那些不能访问互联网的服务器(比如需要认证的网络等等),可以提供代理服务,让该服务器访问互联网!

###需要的配置参数:http_proxy, https_proxy, ftp_proxy…
比如你有一机器的IP为 10.10.10.10,可以用来上网;可以用此机器做代理;
首先下载CCProxy工具,接着在工具的 账号 选项里添加允许访问的内网机器的ip地址;然后启动该工具即可;

###在linux服务器上的配置为:

####vim /etc/profile [全局代理]
http_proxy=http://10.10.10.10:808/
https_proxy=http://10.10.10.10:808/
export http_proxy
export https_proxy
source /etc/profile

####vim /etc/yum.conf
添加:proxy=http://10.10.10.10:808/

ps:有密码的格式为:proxy=http://username:password@yourproxy:8080/

####wget的代理:
vim /etc/wgetrc
添加:
http_proxy=http://10.10.10.10:808/
https_proxy=http://10.10.10.10:808/
ftp_proxy=http://10.10.10.10:808/

yum,wget等一类网页访问的工具走的都是http(s)协议,ping走的是tcp层的协议,代理只是对应用层上的起作用,所以ping命令仍然是ping不通的

Ext4 文件系统的三种模式(mode)

Posted on 2018-10-28

ext4支持3种DATA模式,用来区分journal的行为

###data = journal
在将data写入文件系统前,必须等待metadata和data的journal已经落盘,性能最差;
当调用fsync时,文件系统的操作包含:fsync(data journal)->fsync(metadata journal)->fsync(data)->fsync(metadata)

###data = ordered
此模式不记录data的journal,只记录metadata的journal,但是在写metadata的journal前必须保证data已经落盘;
当调用fsync时,文件系统的操作包含:fsync(metadata journal)->fsync(data)(确保data先落盘)->fsync(metadata)

###data = writeback
不记录data journal,仅记录metadata journal,并且可以不保证data比metadata先落盘;
当调用fsync时,文件系统的操作包含:fsync(metadata journal)->fsync(metadata)

metadata的操作在单个ext4文件系统中是串行的,所以某个用户的metadata操作堵塞的话,会影响所有人操作同一个文件系统的metadata,即使writeback模式下也是如此;

###系统缓存相关的几个内核参数介绍

/proc/sys/vm/dirty_background_ratio

该文件表示脏数据到达系统整体的内存的百分比,此时触发pdflush进程把脏数据写回磁盘;当用户调用write时,如果发现系统中的脏数据大于这个阈值(或dirty_background_bytes),会触发pdflush进程去写脏数据,但是用户的write调用会立即返回,无需等待。pdfl刷脏页的标准是让脏页降低到该阈值以下;

/proc/sys/vm/dirty_expire_centisecs

该文件表示如果脏数据在内存中驻留的时间超过该值,pdflush进程在下一次将把这些数据写回磁盘;

/proc/sys/vm/dirty_ratio

该文件表示如果进程产生的脏数据到达系统整体内存的百分比,此时用户进程自行把脏数据写回磁盘;当用户调用write时,如果发现系统中的脏数据大于这个阈值(或dirty_bytes),需要自己把脏数据刷回磁盘,降低到这个阈值以下才会返回;

/proc/sys/vm/dirty_writeback_centisecs

该文件表示pdflush进程的唤醒间隔,周期性把超过dirty_expire_centisecs时间的脏数据写回磁盘;

###系统一般在下面三种情况下回写dirty页
1)定时方式:定时回写是基于这样的原则:/proc/sys/vm/dirty_writeback_centisecs的值表示多长时间会启动回写线程,由这个定时器启动的回写线程只回写在内存中为dirty时间超过(/proc/sys/vm/dirty_expire_centisecs / 100)秒的页(这个值默认是3000,也就是30秒),一般情况下dirty_writeback_centisecs的值是500,也就是5秒,所以默认情况下系统会5秒钟启动一次回写线程,把dirty时间超过30秒的页回写,要注意的是,这种方式启动的回写线程只回写超时的dirty页,不会回写没超时的dirty页,可以通过修改/proc中的这两个值,细节查看内核函数wb_kupdate。
2)内存不足的时候: 这时并不将所有的dirty页写到磁盘,而是每次写大概1024个页面,直到空闲页面满足需求为止。
3) 写操作时发现脏页超过一定比例:当脏页占系统内存的比例超过/proc/sys/vm/dirty_background_ratio 的时候,write系统调用会唤醒pdflush回写dirty page,直到脏页比例低于/proc/sys/vm/dirty_background_ratio,但write系统调用不会被阻塞,立即返回。当脏页占系统内存的比例超/proc/sys/vm/dirty_ratio的时候, write系统调用会被被阻塞,主动回写dirty page,直到脏页比例低于/proc/sys/vm/dirty_ratio。

###[参考]
https://yq.aliyun.com/articles/15241#

123

hb-lee

30 posts
© 2020 hb-lee
Powered by Hexo
|
Theme — NexT.Muse v5.1.4