avatar
文章
156
标签
74
分类
16

Home
Archives
Link
About
Liarlee's Notebook
搜索
Home
Archives
Link
About
Linux_Ranger_Usage
发表于2021-08-26|更新于2025-09-23|Linux
ranger 备忘 g/ Go root gh Go home gg Go to top G Go bottom # 文件操作 复制、剪切、删除、粘贴 (针对当前文件或则选择的内容) yy 复制 dd 剪切 pp 粘贴 F5 复制 F5 剪贴 F8 删除 Delete 删除 # 书签 mX 把当前目录做一个书签 (X 表示任何字符) 'X 跳到X书签代表的目录 # 标签 不同标签可以复制、粘贴、移动 gn 新建一个标签 Alt+N 跳转到N号标签 (代表一个数字) gt,gT 跳转到前个标签,后个标签 # 排序 对文件和目录列表进行排序,以便查看。 ot 根据后缀名进行排序 (Type) oa 根据访问时间进行排序 (Access Time 访问文件自身数据的时间) oc 根据改变时间进行排序 (Change Time 文件的权限组别和文件自身数据被修改的时间) om 根据修改进行排序 (Modify time 文件自身内容被修改的时间) ob 根据文件名进行排序 (basename) on 这个好像和basename差不多(natural) os 根据文件大小进行排序(Size) # 重命名 修改文件名有两种模式:当前文件和批量改名 cw 新文件名 -- 修改当前文件名 A -- 在当前文件名后追加文字 I -- 在当前文件名前追加文字 :bulkrename --针对mark过的文件批量改名 # 执行shell命令 ! -- 进入命令模式执行shell命令 s -- 同上 # -- 同!,但结果输出到一个pager。相当于 cmd | less @ -- 同!,但会把选择的文件作为参数放在最后。 S -- 进入一个新的shell。exit后回到当前的ranger
Ceph Cluster 03 - CephFS
发表于2021-08-24|更新于2025-09-23|Linux
ceph笔记03 Cephfs的使用Cephfs的使用条件 当我们需要多个服务来挂载和实时的同步的时候, 使用到CEPHFS,可以实现文件系统的共享。内核里面现在这个时间已经内置cephfs的挂载模块, 可以直接挂载不需要安装。 cephfs运行需要MDS服务,用来存储缓存的文件信息。总体需要创建两个存储池,单独创建一个存储MDS信息的存储池, 同时需要创建一个数据池来提供存储空间。 启用mds的服务 ceph orch mds 2 创建ceph的存储池ceph mds stat # 创建一个cephfs的metadata池 ceph osd pool create metadata 32 32 # 创建一个cephfs的data池 ceph osd pool create cephfsdata 64 64 # 创建ceph的状态 ceph osd pool ls ceph -s # 创建cephfs的文件系统 ceph fs new defaultfs metadata cephfsdata # 新的版本里面已经不需要手动创建mds和两个对应的存储池了, 只是需要一条命令就可以自动创建。 [ceph: root@ceph01 /]# ceph fs volume create test [ceph: root@ceph01 /]# ceph fs volume ls [ceph: root@ceph01 /]# ceph mds stat # 需要提前获取挂载的Token: [root@HaydenArchDesktop ceph]# sudo scp root@ceph01:/etc/ceph/ceph.client.admin.keyring /etc/ceph/ [root@HaydenArchDesktop ceph]# mount -t ceph :/ /mnt -o name=admin [root@HaydenArchDesktop mnt]# mount | grep ceph 192.168.31.11:6789,192.168.31.12:6789,192.168.31.13:6789:/ on /mnt type ceph (rw,relatime,name=admin,secret=<hidden>,acl) # # journalctl -f > /mnt/journal.log # 查看cephfs的写入文件的动作过程。 # 同时使用 tail -f 在另一个窗口中查看文件的内容。 测试写入和查看内容的差距。 用户权限MDS可以启动多个实例,多个实例会自动来负载不同资源的文件元数据的缓存。客户端通过MON节点进行授权 和 获取MDS的的位置。MDS现在最新的版本默认已经是一主一备, 自动会生成高可用的模式。(之前的手动部署多个MDS服务器, 然后指定MDS的角色) 创建一个普通用户来进行身份的验证# 创建一个测试的用户 ceph auth add client.testuser mon 'allow r' mds 'allow rw' osd 'allow rwx pool=cephfsdata' # 测试所建立的用户的权限,获取认证的keyring ceph auth get client.testuser # 导出用户的Keyring, 用来做集群的校验 ceph auth get client.testuser -o ceph.client.testuser.keyring # 导出用户的key , Kubernetes的挂载会使用到 ceph auth print-key client.testuser > testuser.key # 验证用户是否可以获取到集群的状态 ceph --user testuser -s # 将挂载点添加到fstab自动开机挂载 MON01:6789,MON02:6789,.........:/ /mnt ceph defaults,name=testuser,secretfile=/etc/ceph/testuser.key,_netdev 0 0 Dashboard权限# 启用或者禁用账户 [ceph: root@ceph01 /]# ceph dashboard ac-user-enable admin # 重置Dashboard用户的密码 # Old Version [ceph: root@ceph01 /]# ceph dashboard set-login-credentials admin -i /etc/ceph/dashboard_password # New version command. [ceph: root@ceph01 /]# ceph dashboard -h | grep ac-user dashboard ac-user-add-roles <username> [<roles>...] Add roles to user dashboard ac-user-create <username> [<rolename>] [<name>] Create a user. Password read from -i <file> dashboard ac-user-del-roles <username> [<roles>...] Delete roles from user dashboard ac-user-delete [<username>] Delete user dashboard ac-user-disable [<username>] Disable a user dashboard ac-user-enable [<username>] Enable a user dashboard ac-user-set-info <username> <name> [<email>] Set user info dashboard ac-user-set-password <username> [--force- Set user password from -i <file> dashboard ac-user-set-password-hash <username> Set user password bcrypt hash from -i <file> dashboard ac-user-set-roles <username> [<roles>...] Set user roles dashboard ac-user-show [<username>] Show user info MDS 高可用# 提升默认的主节点的数量, 来提高MDS服务的吞吐量 ceph fs set defaultfs max_mds 2 ceph fs get defaultfs # 变成两主两备, (设置Rank) # 参数: mds_standby_replay true mds_standby_for_name: MDS_NAME mds_standby_for_rank: 备份指定级别的mds mds_standby_for_fscid: 指定文件系统ID,会联合rank配置生效,如果指定了rank就是指定文件系统的rank会进行主备,如果未指定就是指定文件系统的所有Rank。 如果是一对一的高可用 , 需要对每个mds进行独立的配置。配置样例: # 配置的结果是mds1主, mds2 备; mds3 主, mds4 备. [mds.ceph-mds1] mds_standby_replay = true mds_standby_for_name = ceph-mds2 mds_standby_for_fscid = defaultfs [mds.ceph-mds3] mds_standby_replay = true mds_standby_for_name = ceph-mds4
Ceph Cluster 02 - OSD/RBD
发表于2021-08-23|更新于2025-09-23|Linux
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
发表于2021-08-21|更新于2025-09-23|Linux
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 内核编译初试
发表于2021-07-01|更新于2025-09-23|Linux
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
发表于2020-11-16|更新于2025-09-23|Database
配置监控的时候需要配置和获取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性能调优笔记
发表于2020-08-20|更新于2025-09-23|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 安装记录
发表于2020-06-27|更新于2025-09-23|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硬盘挂载失败
发表于2020-05-30|更新于2025-09-23|Linux
我之前的硬盘上是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虚拟机开启内存大页
发表于2020-05-02|更新于2025-09-23|Linux
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
1…91011…16
avatar
Liarlee
Archlinux User, Support Engineer
文章
156
标签
74
分类
16
Follow Me
公告
都道无人愁似我,今夜雪,有梅花,似我愁。
最新文章
CheatSheet_Kubernetes2333-12-08
CheatSheet_Linux2333-12-08
CheatSheet_Databases2333-12-08
CheatSheet_awscli2333-12-08
PeaZip添加智能解压到win11右键菜单2025-09-14
Fortio 笔记2025-05-09
分类
  • AWS2
  • Application6
  • Books5
  • Database8
  • Docker6
  • EKS5
  • ESXi1
  • ElasticSearch2
标签
VIM Bash Ranger Docker GRUB2 Strace Memory cert OpenSearch RIME SElinux Python Tailscale RPM Perf Prometheus JAVA Ceph PeaZip EBS Application Harbor Steam EKS Firefox Personal CoreOS btrfs English CPU EC2 Ansible LVM TrueNasScale MySQL Redis Kubernetes NAS IO Cilium
归档
  • 十二月 23334
  • 九月 20251
  • 五月 20251
  • 十一月 20241
  • 九月 20242
  • 八月 20241
  • 七月 20243
  • 六月 20242
网站资讯
文章数目 :
156
本站总字数 :
183.1k
本站访客数 :
本站总访问量 :
最后更新时间 :
©2020 - 2025 By Liarlee
框架 Hexo|主题 Butterfly
搜索
数据库加载中