Ceph Cluster 02 - OSD/RBD
Ceph的使用笔记。
创建存储池
# 创建一个PG为64 ,PGP为64的存储池。
[ceph: root@ceph01 /]# ceph osd pool create test-64 64 64
pool 'test-64' created
# 创建一个自动识别的大小的存储池。
[ceph: root@ceph01 /]# ceph osd pool create test
pool 'test' created
# 查看已经存在的存储池。
[ceph: root@ceph01 /]# ceph osd pool ls
device_health_metrics
test
test-64
# 查看存储池的PG 和 PGP 的信息和关系。
[ceph: root@ceph01 /]# ceph pg ls-by-pool test
# 查看OSD的状态。
[ceph: root@ceph01 /]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.58557 root default
-5 0.14639 host ceph01
2 hdd 0.04880 osd.2 up 1.00000 1.00000
7 hdd 0.04880 osd.7 up 1.00000 1.00000
11 hdd 0.04880 osd.11 up 1.00000 1.00000
-7 0.14639 host ceph02
3 hdd 0.04880 osd.3 up 1.00000 1.00000
6 hdd 0.04880 osd.6 up 1.00000 1.00000
10 hdd 0.04880 osd.10 up 1.00000 1.00000
-9 0.14639 host ceph03
1 hdd 0.04880 osd.1 up 1.00000 1.00000
5 hdd 0.04880 osd.5 up 1.00000 1.00000
9 hdd 0.04880 osd.9 up 1.00000 1.00000
-3 0.14639 host ceph04
0 hdd 0.04880 osd.0 up 1.00000 1.00000
4 hdd 0.04880 osd.4 up 1.00000 1.00000
8 hdd 0.04880 osd.8 up 1.00000 1.00000
# 测试上传一个文件并且查看文件的状态和信息。
[ceph: root@ceph01 rpm]# pwd
/var/lib/rpm
[ceph: root@ceph01 rpm]# ls -lh ./Packages
-rw-r--r-- 1 root root 20M Jul 8 17:56 ./Packages
[ceph: root@ceph01 rpm]# rados put msg1 ./Packages --pool=test
[ceph: root@ceph01 rpm]# rados put msg1 ./Packages --pool=test-64
[ceph: root@ceph01 rpm]# rados ls --pool=test
msg1
[ceph: root@ceph01 rpm]# ceph osd map test msg1
osdmap e68 pool 'test' (2) object 'msg1' -> pg 2.c833d430 (2.10) -> up ([9,3,0], p9) acting ([9,3,0], p9)
[ceph: root@ceph01 rpm]# ceph osd map test-64 msg1
osdmap e68 pool 'test-64' (3) object 'msg1' -> pg 3.c833d430 (3.30) -> up ([2,0,3], p2) acting ([2,0,3], p2)
# 删除上传的文件
[ceph: root@ceph01 rpm]# rados rm msg1 --pool=test
[ceph: root@ceph01 rpm]# rados rm msg1 --pool=test-64
[ceph: root@ceph01 rpm]# rados ls --pool=test
[ceph: root@ceph01 rpm]# rados ls --pool=test-64
# 删除刚刚添加的存储池。(临时的解决方案是使用如下的命令, 永久生效的配置写入 /etc/ceph/ceph.conf)
[ceph: root@ceph01 ~]# ceph tell mon.* injectargs '--mon-allow-pool-delete=true'
mon.ceph01: {}
mon.ceph01: mon_allow_pool_delete = 'true'
mon.ceph02: {}
mon.ceph02: mon_allow_pool_delete = 'true'
mon.ceph03: {}
mon.ceph03: mon_allow_pool_delete = 'true'
# 执行删除命令就不会报错了。
[ceph: root@ceph01 ~]# ceph osd pool rm test test --yes-i-really-really-mean-it
pool 'test' removed
[ceph: root@ceph01 ~]# ceph osd pool rm test-64 test-64 --yes-i-really-really-mean-it
pool 'test-64' removed
# 创建一个KVM的块设备池。
[ceph: root@ceph01 ~]# ceph osd pool create kvm 256 256
pool 'kvm' created
# 设置Application enable flag
[ceph: root@ceph01 ~]# ceph osd pool application enable kvm rbd
enabled application 'rbd' on pool 'kvm'
# 初始化池。
[ceph: root@ceph01 ~]# rbd pool init -p kvm
# 创建一个可挂载的镜像。
[ceph: root@ceph01 ~]# rbd create disk01 --size 5G --pool kvm
# 查看镜像的相关信息
[ceph: root@ceph01 ~]# rbd ls --pool kvm
disk01
size 5 GiB in 1280 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 1703d21a8f2ba
block_name_prefix: rbd_data.1703d21a8f2ba
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Mon Aug 23 09:13:58 2021
access_timestamp: Mon Aug 23 09:13:58 2021
modify_timestamp: Mon Aug 23 09:13:58 2021
# 安装Ceph的客户端以及rbd命令。
[root@HaydenArchDesktop hayden]# sudo pacman -S ceph
[root@HaydenArchDesktop hayden]# rbd -p kvm map disk01
/dev/rbd0
[root@HaydenArchDesktop hayden]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
rbd0 254:0 0 5G 0 disk
# 格式化文件系统。
[root@HaydenArchDesktop test]# mkfs.xfs /dev/rbd0
# 挂载。
[root@HaydenArchDesktop test]# mount /dev/rbd0 /opt/test/
# 移除挂载
[root@HaydenArchDesktop test]# umount /opt/test
# 取消这个映射关系。
[root@HaydenArchDesktop test]# rbd unmap /dev/rbd0
Ceph Cluster 01 - Installation
Ceph 的学习笔记和记录。
开始部署信息OS Version: Fedora 34 ServerCEPH Version: v15.2.0 (Octopus) +DOCKER Version: 20.10.8
配置实例的 Hostname 和网络vim /etc/hosts
192.168.122.121 ceph01 ceph01.liarlee.site
192.168.122.122 ceph02 ceph02.liarlee.site
192.168.122.123 ceph03 ceph03.liarlee.site
192.168.122.124 ceph04 ceph04.liarlee.site
[root@ceph01 ~]$ ssh 192.168.122.121 echo "ceph01.liarlee.site" > /etc/hostname
[root@ceph01 ~]$ ssh 192.168.122.122 echo "ceph02.liarlee.site" > /etc/hostname
[root@ceph01 ~]$ ssh 192.168.122.123 echo "ceph03.liarlee.site" > /etc/hostname
[root@ceph01 ~]$ ssh 192.168.122.124 echo "ceph04.liarlee.site" > /etc/hostname
[root@ceph01 ~]$ nmcli conn mod enp1s0 ipv4.address 192.168.122.121/24
[root@ceph01 ~]$ nmcli conn mod enp1s0 ipv4.address 192.168.122.122/24
[root@ceph01 ~]$ nmcli conn mod enp1s0 ipv4.address 192.168.122.123/24
[root@ceph01 ~]$ nmcli conn mod enp1s0 ipv4.address 192.168.122.124/24
[root@ceph01 ~]$ nmcli conn mod enp1s0 ipv4.gateway 192.168.122.1
[root@ceph01 ~]$ nmcli conn mod enp1s0 ipv4.dns 192.168.122.1
[root@ceph01 ~]$ nmcli conn mod enp1s0 ipv4.method manual
[root@ceph01 ~]$ nmcli conn up enp1s0
[root@ceph01 ~]$ sudo systemctl stop firewalld && sudo systemctl disable firewalld
[root@ceph01 ~]$ vim /etc/config/selinux # change it to disabled
CONFIG Dnf Repo# config docker
[root@ceph01 ~]$ wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/fedora/docker-ce.repo
[root@ceph01 ~]$ sudo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Add GPG Key.
[root@ceph01 ~]$ sudo rpm --import 'https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.asc'
# update cache and install cephadm.
[root@ceph01 ~]$ dnf makecache -y && dnf install curl wget htop -y
[root@ceph01 ~]$ dnf install cephadm -y
INSTALL Docker[root@ceph01 ~]$ sudo dnf remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
[root@ceph01 ~]$ sudo dnf install docker-ce docker-ce-cli containerd.io -y
[root@ceph01 ~]$ sudo systemctl start docker containerd
[root@ceph01 ~]$ sudo systemctl enable docker containerd
# Config proxy for docker daemon.
[root@ceph01 ~]$ mkdir /etc/systemd/system/docker.service.d/
[root@ceph01 docker.service.d]$ cat http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://192.168.31.199:7890/"
Environment="HTTPS_PROXY=http://192.168.31.199:7890/"
INSTALL CEPHCephadm tools were default in Fedora Repo, No need to change the repo to tsinghua or aliyun. Just install. WOW ~ Fedora YYDS.
启动一个ceph集群[root@ceph01 ~]$ cephadm bootstrap --mon-ip 192.168.122.121 --allow-fqdn-hostname
Please notice the output, context include username and password and dashboard address.
Ceph Dashboard is now available at:
URL: https://localhost.localdomain:8443/
User: admin
Password: 20jrekw4ko
Enabling client.admin keyring and conf on hosts with "admin" label
You can access the Ceph CLI with:
sudo /usr/sbin/cephadm shell --fsid e8997974-029f-11ec-a59a-525400c06f36 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring
使用 Ceph Shell 命令来管理集群节点# temprary use
[root@ceph01 ~]$ cephadm shell -- ceph -s
# start a interactive shell
[root@ceph01 ~]$ cephadm shell
# check the ceph status
[ceph: root@ceph01 /]$ ceph -s
# list ceph hosts
[ceph: root@ceph01 ceph]$ ceph orch host ls --format yaml
# general a new ssh key for cephadm
[ceph: root@ceph01 ceph]$ cephadm get-pub-key > /etc/ceph/ceph.pub
# copy new key to hosts
[ceph: root@ceph01 ceph]$ ssh-copy-id -f -i /etc/ceph/ceph.pub root@192.168.122.122
[ceph: root@ceph01 ceph]$ ssh-copy-id -f -i /etc/ceph/ceph.pub root@192.168.122.123
[ceph: root@ceph01 ceph]$ ssh-copy-id -f -i /etc/ceph/ceph.pub root@192.168.122.124
维护集群ADD Hosts[ceph: root@ceph01 ceph]$ ceph orch host add ceph02.liarlee.site 192.168.122.122
[ceph: root@ceph01 ceph]$ ceph orch host add ceph03.liarlee.site 192.168.122.123
[ceph: root@ceph01 ceph]$ ceph orch host add ceph04.liarlee.site 192.168.122.124
# set mon sub-network
[ceph: root@ceph01 /]$ ceph config set mon public_network 192.168.122.0/24
ADD Osd# auto-detect available devices (need time to sync the status 1 by 1)
# NOTE: Strangely enough, the command automatically recognizes all devices, including the ZRAM! QAQ.....
[ceph: root@ceph01 /]$ ceph orch apply osd --all-available-devices
# list devices
[ceph: root@ceph01 /]$ ceph orch device ls
Hostname Path Type Serial Size Health Ident Fault Available
ceph01.liarlee.site /dev/vdb hdd 21.4G Unknown N/A N/A Yes
ceph01.liarlee.site /dev/vdc hdd 21.4G Unknown N/A N/A Yes
ceph01.liarlee.site /dev/vdd hdd 21.4G Unk ...
Ubuntu 18.04 内核编译初试
Ubuntu 18.04 上编译内核,生成deb安装包的过程和遇到的问题。使用工具: Linux-tkg系统版本: Ubuntu18.04内核版本: 5.12-muqss-6ms-skylake
背景说明看到B站大佬的教学视频, 使用Linuxtkg进行内核的编译打包和添加muqssCPU调度器, 想自己尝试一下, 同时熟悉一下Ubuntu常见的工具链,所以就开始做了这个事情。
首先是需要对系统进行初始化, 需要一些底层的工具包。 在Ubuntu上面还是有些问题的, 这个坑自己踩了。
]$ sudo apt install zstd git wget sudo bc rsync kmod cpio libelf-dev build-essential fakeroot libncurse5-dev libssl-dev ccache bison flex qtbase5-dev kernel-package
NOTE: 这里面我遇到少了pkg但是没有明确报错的是:zstd & kernel-package ,这两个如果没有正确的安装报错是比较模糊的, 完全不能定向到问题是缺少了这两个包。 (而官方的手册中也没有写需要安装kernel-package就比较坑爹
之后就是下载Linux-tkg ,建议直接从Github下载, Linux-tkg official address
]$ git clone https://github.com/Frogging-Family/linux-tkg.git
在clone完成之后, 执行下面的./install.sh config, 按照提示回答相关的问题。
或者可以直接编辑其中的customization.cfg来设置默认的参数。(这个文件中都是有说明的,还算是比较详细, 一般可以直接看懂。
回答完成问题之后会生成对应的config文件。
执行./install.sh install, 之后会有几个不同的发行版的选择, 只需要选择自己需要的即可, 如果是Deb系的会自动启动编译命令 make -j32 deb-pkg ,自动生成的软件包在./DEBS/*.deb.直接安装即可。如果是rpm也会生成RPMS。
如果中途报错 , 我也不知道具体的处理方式。目前发现的问题如下:
不同版本的ubuntu 表现是不同的, 震惊! 同样的设置参数 ,同样的内核代码和补丁,在Ubuntu 18.04 和 20.04 , 20.04 会成功。
不同环境的结果是不同的, 在一台服务器上面 起Docker容器进行初始化之后编译 会成功的。 在笔记本上不一定会成功。
目前没有总结出任何的相关规律, 太任性了只能说。
如果是不打包成deb,目前的成功率是100%(包括直接将文件释放到系统中, 和打成rpm)。
现在能想到的差不多这些吧 , 反正编译出错就是dpkg-package ERROR 2 , 我现在满脑子都是ERROR 2了, 告辞。
Java连接数据库报错No subject alternative names present
配置监控的时候需要配置和获取MongoDB的信息,使用华为云的MongoDBPaaS服务,如果开启了SSL就无法正常连接。
报错如下:
Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=192.168.1.1:8635, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketWriteException: Exception sending message}, caused by {javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present}, caused by {java.security.cert.CertificateException: No subject alternative names present}}]
网上搜索到的结果基本上都是从开发的角度解决这个错误, 如果是从运维的方向上 , 没有什么有效的方法可以解决这个问题么?比如通过一些参数或者设置。
有的 :
在连接串里加上sslinvalidhostnameallowed=true即可, 设置是直接允许无效的hostname证书, 算是不解决证书问题一个解决方案吧。
所以 最后的连接参数变成:
mongodb://192.168.1.1:8635/test?authSource=admin&ssl=true&sslinvalidhostnameallowed=true
Linux性能调优笔记
应该是一个性能调优的书的笔记, 记不清了, 存货了属于是。
Linux的性能调优CPU性能释放Process生命周期
建立一个新的进程, 表示为父进程, 父进程进入Wait状态。
父进程Fork()系统调用出来的一个子进程。
子进程调用exec()对操作进行执行。
子进程执行结束退出exit()。
子进程变为Zombie进程。
等待父进程回收,更新父进程的运行状态。
进程与线程线程是可以在同一个进程下并发执行的执行单位,他们共享相同的地址,数据和运行空间。线程也叫做(LWP) - 轻量的进程。两者的区别在于,进程在同一个CPU上不能并发执行,且两个进程间不是共享资源的方式进行数据处理的。其他的地方, 进程和线程并无太大的区别,Linux的内核将使用一直的Manner对进程和线程进行调度和处理。
There are several thread implementations avaliable in linux operation system.
Linux threads
传统的Linux进程
Native POSIX thread library
内核 2.6 以后由红帽开发的进程模型。
Next Generation POSIX Thread
IBM开发的新的进程模型。
Note:Linux系统中的环境变量 LD_ASSUME_KERNEL 。
进程优先级
优先级(控制调度的先后顺序): 优先级的范围是: 0 - 139。
Nice值(控制运行时间的长短): 每个进程的nice值,19 到 -20 ,nice值越大 分配的时间越长。19最低 , -20最高。默认的nice值是0。
进程上下文切换每一个进程有独立的数据存储,当多个进程在同一颗CPU切换时,内核会对进程需要的数据空间进行重定向,这个行为叫做上下文切换。Context Swtiching,负责进程的上下文切换以及调度。在多个进程切换的过程中, 每次切换都会触发一次上下文的切换,是导致性能下降的主要原因。
中断CPU的终端控制通常由 硬中断 和 软中断为主, 硬中断通常见于硬件设备,鼠标键盘网卡硬盘设备。软中断常见于TCP/IP协议操作,SCSI协议操作。
Note: 中断的信息显示在: /proc/interrepts。
Note:在多个CPU的系统中,可以将中断集中绑定在某一颗物理的CPU上,可以有效的改善系统的性能。
进程的状态
RUNNING(正常的进程)
STOPPED(已经停止的进程)
UNINTERREPTIBLE(Disk I/O)
INTERREPTIBLE(Keyboard I/O)
ZOMBIE(只能通过结束或重启父进程来回收僵尸进程)
进程的内存空间进程的内存地址空间:(由顶至低顺序为)Text Segment, Data Segment,Heap Segment, Stack Segment
Text Segment : 存储进程可执行代码的部分,只读模式。
Data Segment: 包括三个部分
Data: 数据片段, 初始数据的存储,例如静态变量。
BSS:填零数据的存储。数据初始化为0。
Heap(堆内存): malloc()按需分配的动态内存,堆内存向更高的地址发展。
Stack Segment: 栈内存。存储本地变量, 方法参数,方法返回地址。栈内存向更低的地址发展。
NOTE:可以使用命令pmap查看一个用户空间进程的地址分配情况。可以使用ps命令查看总的内存分配情况。
CPU的NUMA Node
一颗物理CPU 8逻辑核,两个NUMA节点。
4CPU为一组, 在同一个NUMA节点中。
HT技术提供了一个物理两个逻辑CPU。
在 1 情况下,一般不触发跨越NUMA节点的负载均衡,除非子节点过载。
在 2 情况下,提供了调度器tick的 时间调度 和 时间片 调度。
在 3 情况下, 提供调度器tick时间的负载均衡调度。
内存性能Linux内存的结构
物理内存物理的内存的分配分别有32位和64位的不同,
32位系统中只能Linux内核可以直接管理的内存空间只有第一个 1 GB(扣除预留的部分只有896M) , 剩下的空间需要映射到前面的1GB空间中。这种映射会使性能下降,但是对于应用程序来说是透明且无感的。
64位系统中将ZONE-NORMAL的区域扩展到了64GB - 128GB, 就不需要这种映射操作了。
虚拟内存虚拟内存的地址布局
32位架构中,一个进程可以使用的虚拟内存的空间最大只能有4GB。内存被分为了 3GB的用户空间和1GB的内核空间。
64位架构中完全没有这种限制,每个进程都可以使用全部的内存空间。
虚拟内存的管理物理内存通常对于应用或者用户是不可见的,Linux内核会将任何内存自动映射到虚拟内存。
应用不直接使用物理内存而是向内核申请一个确切空间的虚拟内存映射,并在虚拟内存中接收并处理内存的映射关系。
并且,虚拟内存不是必须映射到物理内存,还可以映射到在硬盘子系统中的Swap文件。
应用通常也不直接写入硬盘子系统,而是写入数据到Cache/Buffer中。pdflush内核线程在合适的时间负责将Cache和Buffer中的数据刷写到硬盘。
Linux虚拟内存管理器分配全部的未使用虚拟内存作为磁盘的cache,其他的操作系统只使用内存中的一部分。
同样的,交换的空间的管理同样也是如此,事实上交换空间占用程度并不代表系统的瓶颈所在,相反证明了linux系统资源调度上的高效。
页帧的分配 - 内存分页
Page - 页是在物理内存(Page Frame) 或者 虚拟内存中的连续线性地址空间。
Linux通过控制页单元来控制内存的分配,一页的大小是 4Kb。
内核了解那些分页是可用的,以及他们的确切位置。
Buddy SystemLinux使用这种机制来进行空闲页的管理和维护,并对申请进行分配,始终试图保持内存分页的连续性。当内存的分配失败的时候,会内存的页帧回收。
Page Frame Reclaiming当所有的页已经处于不可用的状态(unavalible),会触发内存的回收机制,将暂时不在使用中的,或者在使用中但是优先级低的内存重新分配,这种机制叫做内存回收。内核线程pswapd和内核函数try_to_free_page()负责执行这个动作。
文件系统Linux可以支持多种多样的文件系统,这得益于内核的VFS技术,VFS是介于用户进程和文件系统之间的抽象层。由于VFS的存在,那么用户进程无需知道文件系统的类型,就可以直接进行文件系统的使用。
用户进程调用文件系统的流程:
User Process –> System Call –> VFS –> Variety of supported file system
日志:
Ext2简单的文件系统,无日志记录
Ext2 文件系统(BlockGroup)结构:
SuperBlock: 存储信息,在每一个BlockGroup的前面都有一个SuperBlock。
BlockGroupDesciptor: 存储BlockGroup的信息。
Data Block Bitmaps: 空闲的数据块管理。
i-node Bitmap: 空闲的Inode管理
i-node Tables: inode的table存储位置。记录了文件的基本信息,例如: uid,gid, atime, ctime, mtime, dtime,指向数据块的位置。
Data blocks: 实际用户数据的存储位置。
文件系统查找文件的过程: 先在/下查看inode信息,查看所找文件的信息,按照路径持续查找,直到找到了文件的inode信息,通过inode提供的信息去数据块读取数据。
Ext3ext3文件系统是ext2 的升级版,主要的变更是支持了文件系统的日志,
ext3支持的日志模式有三种:
journal - 全量记录,数据也元数据都通过日志记录。
Ordered - 只有元数据会记录日志。
Writeback - 记录了元数据的操作,无法保证数据的一致性,突然终止会导致旧数据的出现。
Xfsxfs是新一代的日志文件系统,性能和稳定性都不错。其他资料待补全。
IO子系统进程是如何使用IO子系统进行数据交换的?
进程通过write()系统调用,请求一个文件的写入。
内核更新Pagecache映射到文件。
pdflush内核线程处理pagecache到硬盘。
文件系统层将每个Blockbuffer组成一个Bio结构,提交和写入到块设备层。
块设备层得到上层的请求,执行IO电梯算法操作将数据推入写入队列。
存储驱动接管并执行写入。
硬盘硬件设备执行写入到盘片。
关于缓存(cache)?
由于CPU和硬盘的速度差距太大,因此需要缓存来进行临时的数据存储。
速度递减的结构是:
CPU –> cache –> RAM –> Disk
块层 Block Layer关键的数据结构就是bio结构,bio结构是一种接口,存在于 文件系统层 和 块层之间。
bio就是将相邻的block buffer块整合到一起,发送bio到块层。
块大小直接影响服务器性能的设置。如果需要存储的文件尺寸比较大,那么设置大的blocksize性能更好。
IO电梯算法
Anticipatory
CFQ
BFQ
Deadline
MQ-deadline
NOOP
NONE
存储驱动
SCSI
RAID
网络子系统netstat -n | awk '/^tcp/ {++S[$NF]} END {for (a in S) print a, S[a]}'
# 查看所有的连接状态
当一个应用需要发送网络数据流程:
应用打包自己的数据。
应用通过套接字接口写入数据。
socket buffer用于处理需要被发送的数据。缓冲区引用了数据,并贯穿所有的层。
在每个层中,执行相应的操作,例如数据的封包,添加数据的报文首部。
从网卡的物理接口发出。
以太网帧抵达对端的网卡接口。
如果MAC地址匹配对端网卡的地址,数据帧移动到物理网卡的Buffer。
移动数据包到socket buffer中,同时发出一次CPU硬中断。
数据包逐层解包,直到抵达可以解释的应用层。
通过/proc/sys/net目录可以进行网络子系统的调优。
/proc/sys/net/core/rmem_max /proc/sys/net/core/rmem_default /proc/sys/net/core/wmem_max /proc/sys/net/core/wmem_default /proc/sys/net/ipv4/tcp_mem /proc/sys/net/ipv4/tcp_rmem /proc/sys/net/ipv4/tcp_wmem
Network API(NAPI)NAPI是一种新的网络处理方式,每次对数据包的操作都会触发系统中断,新的方式使用的是poll的方式。
NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中断的方式读取数据,而代之以首先采用中断唤醒数据接收的服务程序,然后 POLL 的方法来轮询数据,
https://www.ibm.com/developerworks/cn/lin ...
ElasticSearch 安装记录
记录一下自己的集群安装过程和常见的命令。
Elastic Search三节点的安装
节点的名称和相关参数:
Host-name
IP
Cluster Name
Role
elk01
192.168.122.101
liarlee-elk
Elasticsearch
elk02
192.168.122.102
liarlee-elk
Kibana
elk03
192.168.122.103
liarlee-elk
Filebeat
使用清华的repo
[elasticsearch]
name=Elasticsearch repository for 7.x packages
#baseurl=https://artifacts.elastic.co/packages/7.x/yum
baseurl=https://mirrors.tuna.tsinghua.edu.cn/elasticstack/7.x/yum/
gpgcheck=0
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
三个服务器都需要安装Elasticsearch并设置开机启动。
# 安装
yum makecache fast && yum install -y elasticsearch
# 编辑配置文件
vim /etc/elasticsearch/elasticsearch.yml
node.master: true[只有其中的两台是主节点即可,剩下的03可以设置为False]
node.name: elk01 [节点的名称,可以自定义,但是一个集群的内部节点名称不能相同]
network.host: 192.168.122.101[每个机器的外部IP]
http.port: 9200
node.data: true [三个节点都可以存储数据]
cluster.name: liarlee-elk [集群的名称三个机器必须一致]
cluster.initial_master_nodes: ["elk1.hayden.cluster"]
discovery.zen.ping.unicast.hosts: ["elk01", "elk02", "elk03"]
discovery.zen.minimum_master_nodes: 1 [最少的master节点需要有一个]
# 复制到02
scp /etc/elasticsearch/elasticsearch.yml root@elk02:/etc/elasticsearch/elasticsearch.yml
# 复制到03
scp /etc/elasticsearch/elasticsearch.yml root@elk03:/etc/elasticsearch/elasticsearch.yml
# 去对应的机器上修改机器名和相关字段,结束, 尝试启动。
确认三个节点的服务是否正常启动。
# 使用curl命令访问节点的restfulAPI
curl http://elk01:9200/_cluster/health?v
curl http://elk01:9200/_cluster/health?pretty
curl http://elk02:9200
curl http://elk03:9200
在02上安装kibana,并且开机启动。
# 使用yum安装
yum makecache fast && yum install -y kibana
systemctl enable kibana && systemctl start kibana
访问Kibana的WebUI,可以正常的使用。
# 通过API检查
curl http://elk02:5601
# 通过WebUI检查
firefox http://elk02:5601/
配置filebeat 无脑收集/var/log/messages, 并查看上报的状态。
# 安装filebeat, 开机启动
Download from ELK offical website : filebeat-7.7.1-linux-x86_64.tar.gz
cd /opt/filebeat/filebeat-7.7.1-linux-x86_64
vim ./filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/messages
output.elasticsearch:
hosts: ["192.168.122.101:9200"]
setup.kibana:
host: "192.168.122.102:5601"
# 运行
cd /opt/filebeat/filebeat-7.7.1-linux-x86_64
sudo nohup ./filebeat -e -c filebeat.yml >/dev/null 2>&1 &
观察集群的日志的收集状况,我在这个时候已经没有其他的问题了…. Over.
其他
我自己的虚拟机我是经常性的暴力关机的,所以遇到了节点的状态同步不正确,这导致我的ES集群启动的时候总是只有一个节点在线 ,其他的节点无法加入, 可以在ES的日志中观察到,节点试图添加,但是无法成功加入, 这个时候只需要删除无法加入节点的Node数据即可。
记一次旧LVM硬盘挂载失败
我之前的硬盘上是fedora默认的LVM分区,我换了硬盘之后,弄了一个硬盘盒,把旧的硬盘放进去,连到电脑上试图把旧的数据取出来。发现系统已经正确的识别了PV,VG,LV,但是不能挂载, 提示无法读取硬盘的Superblock 和提示 mount: unknown filesystem type ‘LVM2_member(这个提示说明你是直接挂载的/dev/sdx,LVM需要你挂载的应该是逻辑卷,不是物理设备)。
问题是这样的HaydenArchLinux$ lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home fedora_localhost-live -wi------- <118.77g
root fedora_localhost-live -wi------- 70.00g
swap fedora_localhost-live -wi------- 7.75g
---
HaydenArchLinux$ vgs
VG #PV #LV #SN Attr VSize VFree
fedora_localhost-live 1 3 0 wz--n- <196.52g 0
---
HaydenArchLinux$ vgchange -ay /dev/fedora_localhost-live
device-mapper: create ioctl on fedora_localhost--live-swap LVM-SPkNfSXuuIWyxOArrqJAnfQbYfU4tEKFIj295MyZpNmiMsazbwuGuLsrDgl7u509 failed: Device or resource busy
device-mapper: create ioctl on fedora_localhost--live-home LVM-SPkNfSXuuIWyxOArrqJAnfQbYfU4tEKFqvyrcOAarRr7ol6o2DbieN2mIRCnqi0m failed: Device or resource busy
device-mapper: create ioctl on fedora_localhost--live-root LVM-SPkNfSXuuIWyxOArrqJAnfQbYfU4tEKFkTeSg9t8t8dy1jqHhzD6BRcOoJ7dG0H2 failed: Device or resource busy
0 logical volume(s) in volume group "fedora_localhost-live" now active
---
HaydenArchLinux$ lvdisplay
--- Logical volume ---
LV Path /dev/fedora_localhost-live/home
LV Name home
VG Name fedora_localhost-live
LV UUID qvyrcO-AarR-r7ol-6o2D-bieN-2mIR-Cnqi0m
LV Write Access read/write
LV Creation host, time localhost-live, 2020-04-05 03:07:47 +0800
LV Status NOT available
LV Size <118.77 GiB
Current LE 30405
Segments 1
Allocation inherit
Read ahead sectors auto
可以注意看上面的vgchange的时候显示LVM-SPkNfSXuuIWyxOArrqJAnfQbYfU4tEKFqvyrcOAarRr7ol6o2DbieN2mIRCnqi0m failed: Device or resource busy, lvdisplay显示lv status是NOT avaliable。
去Google了一下,大部分复制粘贴来的答案都是:
两种方法,第一种是直接mount /dev/fedora_localhost-live/home /mnt;第二种是格式化硬盘。
我不需要这种粗鲁的处理方式,第一种和第二种其实都是废话。
处理方式是这样的简单说明一下,使用dmsetup命令,dmsetup是一个偏向底层的逻辑卷管理工具,可以对现在已经有的逻辑卷进行更改。我的初步怀疑是Arch自动识别挂载了旧硬盘的逻辑卷但是,使用了错误的参数,导致设备被占用但是我无法再次挂载使用。使用dmsetup remove 参数将系统现在已经识别出来的逻辑卷移除, 之后手动使用vgchange重新读取,问题解决了。
HaydenArchLinux$ dmsetup remove /dev/fedora_localhost-live/home
HaydenArchLinux$ vgchange -ay
3 logical volume(s) in volume group "fedora_localhost-live" now active
HaydenArchLinux$ lvdisplay
--- Logical volume ---
LV Path /dev/fedora_localhost-live/home
LV Name home
VG Name fedora_localhost-live
LV UUID qvyrcO-AarR-r7ol-6o2D-bieN-2mIR-Cnqi0m
LV Write Access read/write
LV Creation host, time localhost-live, 2020-04-05 03:07:47 +0800
LV Status available
# open 0
LV Size <118.77 GiB
Current LE 30405
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:1
HaydenArchLinux$ mount /dev/fedora_localhost-live/home /mnt
如上才是正确的处理方式。
KVM虚拟机开启内存大页
Huge Pages是从Linux Kernel 2.6后被引入的。目的是使用更大的内存页面(memory page size) 以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能。透明大页(Transparent Huge Pages)缩写为THP,这个是RHEL 6(其它分支版本SUSE Linux Enterprise Server 11, and Oracle Linux 6 with earlier releases of Oracle Linux Unbreakable Enterprise Kernel 2 (UEK2))开始引入的一个功能。具体可以参考官方文档。
概念这两者有啥区别呢?
这两者的区别在于大页的分配机制,标准大页管理是预分配的方式,而透明大页管理则是动态分配的方式。
使用大页的目的:
增加内存寻址的命中率,如果使用旧的内存分页方式,操作系统需要管理很多很多的小的内存页面,查找和命中的效率比较低。
想象一下, 你有一本1000页的书,你需要找到其中的第782页的第20行中的一个“我”字,那么计算机会从第一页开始翻动一页一页的看是否符合要求;现在我将书藉的每100页合成1页,那我们只需要顺序查看10次就可以找到这个字符所在的范围了,之后再去查看这个字符所在的具体位置,速度就会比之前一页一页找快得多。
配置启用手动分配的HugePage
设置操作系统可用的最大内存值
vim /etc/security/limits.conf
* soft memlock 8192
* hard memlock 8192
设置sysctl.conf
# vim /etc/sysctl.conf
vm.nr_hugepages = 72708
# sysctl -p
根据我的测试 ,需要重启才会生效,Hugepage部分的内存会一直属于使用中的内存,并且一直被占用。我的配置用了16G内存之中的8G,所以开机之后,我的8G内存是一直使用中的状态, 无论你的应用是否真正的开始使用了这部分Hugepage.
下面举例了如何查看Hugepages的信息:
$ cat /proc/meminfo | grep Huge
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 4096
HugePages_Free: 4096
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 8388608 kB
我的需求试使用Hugepage来分配给KVM中的虚拟机, 加速虚拟机的内存使用效率,所以当然是在虚拟机的配置文件中配置,编辑虚拟机/etc/libvirt/qemu/HaydenGentoo.xml, 改成如下的样子:
<memory unit='KiB'>4194304</memory>
<currentMemory unit='KiB'>4194304</currentMemory>
<memoryBacking>
<hugepages/>
</memoryBacking>
之后重启虚拟机即可。可以观察到如下改变说明已经在使用了。
$ cat /proc/meminfo | grep Huge
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 4096
HugePages_Free: 2048
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 8388608 kB
在某些场景下完全关闭THP查看当前的状态
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
禁用THP
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
完全禁用 THP
grubby --update-kernel=ALL --args="transparent_hugepage=never"
---
sudo systemctl reboot
正见——佛陀的证悟(一)诸行无常(选摘)
这是从《正见-佛陀的证悟》这书中,摘出来的句子,我认为有意义,或者对四法印中的诸行无常有理解的部分, 一直放在QQ空间中, 前两天拿出来看了一下, 觉得还是有不少的体会,所以把它搬过来了, 后续的内容是不是会更新还是要看我懒不懒了。
只是对老与死的厌恶,并不足以让太子离开王宫而踏入未知的世界;悉达多会采取这么激烈的行动,是因为他实在无法合理地解释所有已生和将出生的一切众生命运就是如此而已。如果所有生者都必须衰朽死亡,那么花园中的孔雀、珍宝、华盖、熏香、音乐,放拖鞋的金质拖盘、进口的玻璃水瓶、他与耶输陀罗和罗睺罗的感情、家庭、国家,都变得毫无意义。这一切的目的到底是什么?
完全不凭借任何科学工具,悉达多太子以吉祥草为垫,坐在一棵菩提树下,探索人类的本性。经过了长时间的思维,他终于了悟到一切万有,包括我们的血肉、我们所有的情绪和我们所有的觉受,都是由两个以上的元素组合而成。当两种或多种元素和合在一起,新的现象就会产生;钉子和木头产生了桌子;水和叶子产生了茶;而恐惧、虔诚和救世主,就产生了神。这些最终的产物,并没有独立于其各别元素的存在。相信它真实独立存在,是最大的骗局。而在和合的同时,各个元素也起了变化。只因接触和合,它们的性质也随之改变了。
一切万有,没有一样是以独立、恒常、纯粹的状态存在。你手上的书不是,原子不是,甚至神祇也不是。
因此悉达多发现,无常并不像一般人以为的就是意味死亡,而是意味变化。任何事物和另一个事物之间的位置或关系转变了,即使是非常细微的变动,都要依循无常的法则。
如果没有盲目的期待,就不会有失望。如果能了解一切都是无常,不会攀缘执著;如果不攀缘执著,就不会患得患失,也才能真正完完全全地活着。
悉达多从恒常的幻相中觉醒,因此我们称他为佛陀、觉者。到现在还是没有人可以长生不老,每个人终究会死,而且每天大概有二十五万人死亡。我们亲近的人不是已经死亡就是将会死亡。然而当亲人死去的时候,我们还是会震惊和悲伤;我们还是继续寻找青春之泉,或是长寿的秘方。
悉达多太子不再需要或渴求长生不老药了。由于了悟到一切事物皆是和合而成,解构无止境,而且一切万有的各个成分,没有一项是以独立、恒常与纯粹的状态存在的,他因此获得解脱。一切和合之物(现在我们知道这是指一切事物)与其无常的本质是合而为一、不可分割的。
当悉达多看到一个人走过,即使他很健康,悉达多所看到的是此人的生与灭同时发生。你也许会认为这样的人生观不太有趣,但在生命的旅程中能够同时看到一体的两面,可以是非常奇妙,而且可能会有很大的满足感。
也就表示现在有个“假设者”,悉达多会同意,只要有假设者,就会有上帝存在;但如果没有假设者,就不会有上帝存在。如果没有纸,就不会有书。如果没有水,就不会有冰。如果没有开始,就不会有结束。一件事物的存在,亟需依赖其它事物的存在,因此没有什么是真正独立的。尽管我们以为可以控制变化,但事实上大多是不可能的,因为无法察觉的影响因素太多了。也因为这种相互依存性,一切事物不可避免地会从目前或原始状态中解体。每一个变化中都蕴藏着死亡的因素。今日就是昨日之死。
大部分的人都接受一切生者终将死亡。然而我们对“一切”与“死亡”的定义或许不太一样。对悉达多来说,生指的是一切万有,不仅仅是花朵、蘑菇、人类,而是一切生成或和合的事物。而死亡指的是任何的解体或是解构。无常纯粹是一个简单实在的事实。不可能有一天,某个突发的和合事物会突然变得恒常,更难想象我们能证明这样的事。但是在今天,我们不是将佛陀奉为神明,就是想用科技证明自己比佛陀更高明。
佛陀教导我们,至少我们心中要保持着无常的概念,不要故意去隐藏它。我们借着不断地觉察和合的现象,便会了知因缘相依。认识因缘相依,我们就会认识无常。而当我们知道一切事物皆无常,才不会被种种假设、僵化的信条(不论宗教的或世俗的)、价值体系和盲目信仰所奴役。我们的觉察力可以让我们免于受限于个人的、政治的和感情的戏码之中。我们还可以将这种觉察力导向大至想象之极,小至次原子层次。
由于我们对自己的道德原则感到自豪,而且常强加于别人身上,因此道德观还是具有少许价值。然而,在整个人类历史当中,道德的定义也随着时代精神而一直在改变。美国人度量政治正确性或不正确性的仪表起伏不定,令人迷惑。不管如何称呼种族或文化群体,总是有人会被冒犯,游戏规则一直在改变。
当悉达多提到“一切和合的事物”,他所指的不只是像DNA、你的狗、艾菲尔铁塔、卵子和精子等具体可认知的现象而已。心、时间、记忆和上帝,也是和合而成。而每一和合的成分,又依赖更多不同层次的和合而成。 当悉达多教导无常时,他也超越了一般“结束”的想法,像是那种认为死亡只发生一次就完了的概念。死亡从生、从创造的那一刻开始,就没有停过。每一个变化,都是死亡的一种形式,因此每一个生都包含了另一个事物的死亡。
拿煮鸡蛋来做例子。如果没有不断的变化,蛋就煮不熟;煮好蛋的这个结果,需要某些基本的因缘。很显然的,你要有一颗蛋、一锅水,和一些加热的元素。另外有些非必要的因和缘,像是厨房、灯光、计时器,还有一只把蛋放进锅子的手。另外一个重要的条件,就是没有像是电力中断或是山羊跟进来打翻锅子之类的干扰。此外,每一个条件,例如母鸡,都需要有另一套具足的因缘条件。需要有另一只母鸡生下蛋才能孵出它,还要有安全的地方,有食物才能让它成长。鸡的食物也要有适合的地方生长,并且要能让它吃进去才行。我们可以将非必要和必要条件一直分析到小于原子的程度,而在这个分析的过程中,各种形态、形状、功能和标签也会不断地增加。
当无数的因缘和合在一起,而且没有障碍与干扰,结果是必然的。许多人误以为这是注定的或是运气所致。然而,到了一个程度以后,即使我们祈求蛋不要煮熟,它还是会熟的。
就像蛋一样,所有的现象是由无数的成分所组成,因此它们是可变的。这些无数的成分几乎都不是我们所能控制的,所以会让我们的期待落空。这种不可预料性,遍在于所有的物质、感受、想象、传统、爱情、信任、不信任、怀疑论,甚至上师和弟子以及人与神之间的关系。
信仰,怀疑论以及所有和合的现象一样,都是无常的。
有些人到现在还认为马克·查普曼(Mark Chapman)是谋杀约翰·蓝侬(John Lennon)唯一的罪犯。当我们能了解一个病态而饱受折磨的心是如何形成,并且知道它是在什么样的情况下运作,就比较能够理解并宽恕世界上众多的马克”查普曼。当条件成熟,就像蛋煮熟了一样,即使我们祈祷暗杀事件不要发生,它还是避免不了。超过了某个时间点,我们要改变条件的企图和行为就会徒劳无功了。
恐惧和焦虑是人类心智中主要的心理状态。恐惧的背后是对确定性不断的渴求。我们对未知感到恐惧。人心对肯定的渴望,是根植于我们对无常的恐惧。
但我们常常忘记自己的来日一直都是有限的。即使理智上知道有生必有死,一切和合终将分散,我们的情绪状态还是常常会回到相信恒常的模式,完全忘记相互依存性。这种习气会造成各种负面的情况,像是偏执、寂寞、罪恶感等等。我们会觉得被欺骗、被威胁、被虐待、被冷落,仿佛这个世界只对我们不公平。
佛陀不是一个悲观者、也不是末日论者,他是重视实际者,而我们却多是逃避现实者。当他说一切和合皆是无常,他并不认为那是坏消息,而是简单、科学的事实。我们能认清因缘的不稳定,就会了解自己有力量转化障碍,并且完成不可能的任务。生活中的各个层面都是如此。如果你现在没有一台法拉利,你完全有可能创造出因缘而拥有一台。只要世上有法拉利,你就有机会去拥有它。同样的,如果你想活久一点,可以选择不抽烟和多运动。合理的希望是存在的。而绝望,和它的反面—模一样,都是相信恒常的结果。
less命令占用内存过高
在华为的月度报告中, 发现了奇怪的问题,有一台机器在每天都会内存使用率飙到100%,偶尔的几次还会出现OOM的记录。在追踪问题的过程中,发现机器上每天的2,4,6,8点会自动运行处理日志的脚本,并统计关键字的数量。
这个脚本的过滤日志思路是, 使用 less 命令打开昨天的所有日志文件,并且读取内容,过滤其中的关键字,命令类似如下:
less yesterday*.log.gz | grep -e "xxxxx" -e "xxxxx" | sort | uniq | wc -l
关于Less, More, Cat, Zcat这个四个命令可以分成两组:
less / more 的命令是为了个人类查看文件的内容设计的程序;
cat / zcat 是一次性输出内容到屏幕的;
两组命令的唯一区别是是否提供前后反复查看的功能。但是就是这个功能,导致了命令执行的逻辑其实是完全不同的。
less命令的执行方式将查看到的数据放入内存中(USED),所以 如果是一个10G的日志,就会占用10G的内存, 如果不够,系统就会进行交换和将旧数据换出的操作。cat的执行模式是将数据直接输出到/dev/stdout,同时操作系统会将数据存储到Cache中,不会触发内存的告警, 由于日志中的数据其实只是进行一次过滤, 所以不需要长期的保留, 这也提高了bash处理日志文本的速度。
补充一下, Vim也是一样的, Vim会尽可能的将文件载入到内存里, 所以日志类的文件是不需要, 也不能使用Vim的.
结论由于两个命令的处理方式不同,因此直接将命令中输出gz日志的命令换成了zcat,即可保证内存的使用不会变多, 这里同时提高的处理文本命令的效率,这个机器专门用来做这一件事情, 所以不需要考虑其他进程会影响日志处理, 造成数据的不一致。所以在脚本中一定一定使用正确的命令和方式处理数据,才能保障性能和效率的兼顾。
最后,优化过的命令为:
zcat yesterday*.log.gz | grep -e "xxxx" -e "xxxx" | sort -u | wc -l
最后的执行时间,从原来的半个小时起步,变成了10分钟即完成。
后续的处理已知我们的问题是不需要系统自动cache住我们过滤的日志数据,我们可以手动释放一下已经无用的cache内容:
sync && echo 3 > /proc/sys/vm/drop_caches
后面还添加了并行执行的处理命令, 但是这个并行执行的脚本确实写的非常的垃圾。 另外添加了使用python 自动填写过滤的结果到 Excel 表格。