正见——佛陀的证悟(二)诸漏皆苦(选摘)
悉达多没有继续前行,决定留在当地禅修。他在附近的一棵毕钵罗树下找到一块平坦的石头,铺上吉祥草当坐垫。他静默地立下誓言,此身可烂,我可能化为尘土。但直到找到答案,我绝不起身(我今若不证,无上大菩提,宁可碎此身,终不起此座)。
问一个佛教徒“什么是人生的目的?”是不恰当的。因为这个问题暗喻在某一个地方,也许在一个洞穴之中或者在一人山岭之上,存在着一个究竟的目的。仿佛我们可以透过追随圣者,阅读书籍以及熟悉秘教修行,来解开这个秘密。如果这问题是假设在亿万年以前,有某个人或神设计了一个人生目的图表,那么它就是一个有神论的观点。佛教徒不相信有个全能的创造者,而且他们不信为生命的目的已经、或需被决定和定义。
即使在个人身上,痛苦和快乐的定义也时有变动。一个轻佻的调情时刻,可能因为其中一个人想要更认真的关系而突然变调,期待转为恐惧。当你是个小孩的时候,在沙滩上堆筑沙堡就是快乐。在青少年时期,看着穿比基尼的女孩,和赤裸上身的男孩冲浪是快乐。在中年,金钱和事业是快乐。当你八十多岁的时候,收集陶瓷盐罐是快乐。对许多人而言,不断调适于这些无尽而又经常变化的快乐定义,即是“人生的目的”。
我们人类在追求快乐、止息痛苦上,用尽了无数的方法和工具,远超过任何其它的嗜好和职业。因此我们拥有电梯、笔记型电脑、充电电池、电动洗碗机、自动弹出完美土司的烤面包机、狗粪吸尘器、电动鼻毛修剪器、温热坐垫马桶、奴佛卡因麻醉药( Novocaine)、行动电话、威而刚、整铺地毯子……,然而不可避免的,这些便捷也制造了等量的头痛。
悉达多当时也是在试图根除痛苦。但他不是梦想着诸如展开政治改革、移民到另一个星球或创造世界新经济;他甚至没有想到要创造一个宗教,或发展一套能带来安详与和谐的行为准则。他以开放的心灵来探索痛苦,透过勤奋不懈的沉思,悉达多发现,追本溯源,导致痛苦的是人的情绪。事实上上,情绪即是痛苦。不论如何,直接或间接的,一切情绪都是生于自私,也就是说,它们都与执着于自我有关。更进一步的,他也发现,情绪虽然看似真实,但不是一个人本具存在的一部分。它们不是与生俱来的,也不是某个人或某个神强加在我们身上的诅咒或植入。当某些特定的因与缘聚合在一起的时候,情绪就会生起,例如当你突然认为某个人在批评你、忽视你,或者剥夺你的利益时。然后,相对应的情绪就会接着生起,在接受、陷入这些情绪的当下,我们就失去了觉知和清明。我们“被鼓动”了。因此悉达多发现他的解决方法—-觉知。如果你认真地想要根除痛苦,你必须培养觉知,留心你的情绪,并且学会如何避免被鼓动起来。
如果你像悉达多一样地检视情绪,试图找出它们的起源,你将会发现它们根植于误解,因此根本上是错误的。基本上,所有的情绪都是一种偏见,在每一种情绪之中,都存在有分别心的成分。
看透了宫廷生活的表象,悉达多现在能够看见自己的身体是不具本质的。在他的眼中,火圈和身体具有相同的本性。如果有人相信其中之一真实存在—-不论是短暂的或恒常的——那么他的信念就是根源于误解;如此,便是失去了觉察,也就是佛教徒所说的无明。我们的情绪,就是从这无明所生起。从失去了觉察到情绪生起的过程,可以用四真谛完全解释。我们接下来会谈到。
魔罗想要争取更多追随者,因而聪明地鼓吹自由,但是如果有人真的行使自由,他不一定会喜欢。基本上,我们只想要让自己,而不想让他人拥有自由。难怪,我们真的行使所有的自由,就不会被邀请去参加任何派对了。
悉达多的解答是—-培养对情绪的觉察。如果情绪正在起的时候,你能够有所觉察,即使只是一点点,不能够限制它们的活动;它们变成象有监护人在旁的青少年。有人在监视着,魔罗的力量就会减弱。悉达多没有被毒箭所伤,因为他觉察到这些只不过是幻相。同样的,我们自己强大的情绪,也可以变成象花瓣一般地不具杀伤力。当天女接近悉达多的时候,他清楚地了解,她们如同火圈,只是和合而成的,因此她们失去了诱惑力,无法动他一丝一毫。同样的,只要了解我们所欲求的对象事实上是和合而成的现象,就能破除诱惑的魔咒。
当你开始注意到情绪所能够造成的损害,觉知就会开始发展。当你有了觉知—-举例来说,如果你知道自己正站在悬崖上行走不再那么恐怖,事实上,它反而是非常刺激的。不知才是恐惧的真正根源。觉知不会妨碍你的生活,反而让生命更加充实。如果你在享用一杯茶,而且了解短暂事物的甘与苦,你将能够真正的享受那杯茶。
EBS 性能优化笔记
EBS性能优化Agenda
磁盘调优方法论
常用的磁盘调优方法
磁盘压测工具
磁盘性能检测工具
目前比较常用的是 GP3。
方法论应用程序 –》 操作系统 –》 虚拟机 –》 EBS 服务器
应用程序IO请求下发的路径。
三个方向, iops, 带宽, 延迟,按照这三个方面来观察这个EBS本身的性能。
使用新版本的内核:
3.8 以上内核使用的Indirect descriptors
突破 I/O size 44kiB限制, 可以一次请求下发 128KiB的IO大小。
建议使用 amazonlinux 2023 (悲
uname -r 查看内核的版本。
使用 Raid0使用 Raid0 可以提高带宽, 并且节省成本。
能更换磁盘类型达到性能, 可以使用Raid0
不建议在EBS 做 Raid1 5 6 三种, 校验的方式会降低性能。
推荐使用 mdadm , 不一定要用LVM。
关注队列长度SSD: 每 1000iops 队列长度是 1 , SSD是合适的吧
观察队列长度, 如果能达到 IOPS 的情况下, 队列越低越好。
HDD: 1MiB的IOsize , 建议的队列长度 4
降低io队列的方法,取决于发送IO的速度和线程数量。 或者提高磁盘的IOPS
HDD吞吐量设计增加预读取大小For st1/sc1.
blockdev --report /dev/nvme1n1 # 查看块设备的参数
blockdev --setra 2048 /dev/nvme1n1 # 设置块设备预读取数据量的大小
blockdev --getra /dev/nvme1n1 # 查看参数是否生效。
这个部分是为了增加吞吐量而在Read的同时将后面的一部分数据读取进入内存, 这样可以提高顺序读取的效率, 提高读取的效率, 让顺序读取的业务数据提前进入内存。
使用 Nitro 架构实例
之前使用zen的时候有一个Dom0来进行实例的管理。 nitro 做成 Hardware, nitro 管理VPC等等等, 尽可能把 X86 过度给客户来使用。
Refer to: https://zhuanlan.zhihu.com/p/270522703
开启EBS优化选项。 非优化的场景下,会与网络请求共享带宽, EBS优化这个功能单独隔离了EBS的网络请求。
使用正确的实例类型关注实例的限制, 例如实例的上限是 14000 , 那么实例使用EBS的瓶颈不在磁盘本身, 在实例的性能上限。
压测工具
dd
hdparm
sysbench
iometer
iozone
推荐使用的工具是 :fiofio项目文档
ebs设置默认的 Block Size是 16k , 其他厂商可能是 4k 的。 这个部分可能会在测试的时候造成差异。关于 fio 几个参数的测试, 这是我找到测试最完整的一个:
探索fio参数
测试命令#!/bin/bash
# 这个命令的运行结果是, 一个 job 在 iodepth 为 1 的时候, 写入与底层一样的块大小,在iostat 中可以看到 avgqu-zs 的大小是 1。
# 添加一个process之后, 队列的size 变成了2 ; 添加一个 iodepth 之后, 队列的大小为 1 ~ 2 之间。
# 大佬认为内核的蓄流将请求合并了, 所以没有造成对应的压力。
fio --directory=/mnt --name fio_test_file --ioengine=libaio --direct=1 --rw=read --rate_iops=1 --bs=16k --size=200M --iodepth=1 --numjobs=1 --time_based --runtime=600 --group_reporting --norandommap
perf record -g result (libaio):
fio 319375 86964.196578: 250000 cpu-clock:pppH:
ffffffff88355470 put_dec+0x0 (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff8835584b number+0x33b (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff8835ac9d vsnprintf+0x44d (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff8835afe2 sprintf+0x62 (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff87efc94c dev_show+0x2c (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff87efbc6c dev_attr_show+0x1c (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff87abac9b sysfs_kf_seq_show+0xab (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff87a2a7a3 seq_read_iter+0x123 (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff879f4c06 vfs_read+0x1f6 (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff879f59ff ksys_read+0x6f (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff88364360 do_syscall_64+0x60 (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff884000f3 entry_SYSCALL_64+0xb3 (/lib/modules/6.4.10-arch1-1/build/vmlinux)
103fdc read+0x4c (/usr/lib/libc.so.6)
0 [unknown] ([unknown])
perf record -g result (psync):
fio 324148 87167.271746: 250000 cpu-clock:pppH:
ffffffff8835480c strlen+0xc (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff87a2990b seq_puts+0x1b (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff87aa94ee render_sigset_t+0x1e (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff87aa9c96 proc_pid_status+0x716 (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff87aa1e34 proc_single_show+0x54 (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff87a2a7a3 seq_read_iter+0x123 (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff87a2abe4 seq_read+0xd4 (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff879f4abc vfs_read+0xac (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff879f59ff ksys_read+0x6f (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff88364360 do_syscall_64+0x60 (/lib/modules/6.4.10-arch1-1/build/vmlinux)
ffffffff884000f3 entry_SYSCALL_64+0xb3 (/lib/modules/6.4.10-arch1-1/build/vmlinux)
103fa1 read+0x11 (/usr/lib/libc.so.6)
0 [unknown] ([unknown])
Psync Vs Libaiolibaio 用来提供较高的iops测试, 异步 io 的优势psync 用来提供延迟的基准, 延迟敏感的测试或者 同步IO 的测试可以使用 psync.
观测可以直接使用这个命令来观察磁盘的使用情况, 磁盘的使用率其实并不太准确,这个表示单位时间内cpu时间被io请求占用的时间。个别的 10ms 之上的IO请求的长尾现象是正常的, 这个无法避免。
关于长尾现象的说明:
长尾请求一般是指明显高于均值的那部分占比较小的请求。 业界关于延迟有一个常用的P99标准, 也就是99%的请求延迟要满足在一定耗时以内, 1%的请求会大于这个耗时, 而这1%就可以认为是长尾请求。
Refer to: https://zhuanlan.zhihu.com/p/35516682
X11 通过 ssh 转发图形化界面
Ssh 转发 X11sudo yum install xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Type1 xclock
vim /etc/ssh/sshd_config
X11Forwarding yes
X11UseLocalhost no
运行图形化的命令 , 自动捕获请求, 查看mobexterm是否已经正常的启动了一个临时的窗口来进行数据的转发即可 。
Ssh 转发连接到远端ssh -L local-port:target-host:target-port tunnel-host
ssh -vvv -f -N -D 0.0.0.0:30890 hayden@localhost
Ssh 转发命令参数说明-L listen-port:host:port 指派本地的 port 到达端机器地址上的 port
建立本地SSH隧道(本地客户端建立监听端口)
将本地机(客户机)的某个端口转发到远端指定机器的指定端口.
-R listen-port:host:port 指派远程上的 port 到本地地址上的 port
建立远程SSH隧道(隧道服务端建立监听端口)
将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口.
-D port 指定一个本地机器 "动态的" 应用程序端口转发.
rime的配置
https://github.com/iDvel/rime-ice
https://rime.im/
小狼毫输入法, 或者Fcitx5 挂载 rime 即可。
后面如果还有输入法相关的内容会放在这个里面。
小鹤双拼> cat ./default.custom.yaml
patch:
schema_list:
- schema: double_pinyin_flypy # 小鹤双拼
ascii_composer:
good_old_caps_lock: true # true | false
switch_key:
Caps_Lock: clear # commit_code | commit_text | clear
Shift_L: noop # commit_code | commit_text | inline_ascii | clear | noop
Shift_R: noop # commit_code | commit_text | inline_ascii | clear | noop
Control_L: noop # commit_code | commit_text | inline_ascii | clear | noop
Control_R: noop # commit_code | commit_text | inline_ascii | clear | noop
输入法默认不切换全半角> cat ./default.custom.yaml
patch:
switches:
- name: ascii_mode
states: [ 中 ]
reset: 0
- name: ascii_punct # 中英标点
states: [ ¥, $ ]
reset: 0
- name: traditionalization
states: [ 简, 繁 ]
reset: 1
- name: emoji
states: [ 💀, 😄 ]
reset: 1
- name: full_shape
states: [ 半角, 全角 ]
reset: 0
serviceAccount 获取 Token 以及权限的方式
手动获取Token 并发送请求给容器接口。
/var/run/secrets/kubernetes.io/serviceaccount $ pwd
/var/run/secrets/kubernetes.io/serviceaccount $ cat ./token
eyJhbGciOiJSUzI1NiIsImtpZCI6ImE3N2JhOGMwY2FjYWEwNDk0MWU4MWM0ODk1Y2JiZjBiOTU2NTA1OTYifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjIl0sImV4cCI6MTcyMTk3ODkxOCwiaWF0IjoxNjkwNDQyOTE4LCJpc3MiOiJodHRwczovL29pZGMuZWtzLmNuLW5vcnRoLTEuYW1hem9uYXdzLmNvbS5jbi9pZC9DMEE5NzJGNERCMThBOTMxN0RBMzk0Q0MwRDMzMjU3RiIsImt1YmVybmV0ZXMuaW8iOnsibmFtZXNwYWNlIjoibW9uaXRvcmluZyIsInBvZCI6eyJuYW1lIjoicHJvbWV0aGV1cy1rOHMtMCIsInVpZCI6ImE4YzdkMGY2LWUyMmEtNGY2Ny04NzYzLWNiNGQwYzM5MWFlMCJ9LCJzZXJ2aWNlYWNjb3VudCI6eyJuYW1lIjoicHJvbWV0aGV1cy1rOHMiLCJ1aWQiOiJmN2M3YWMzZC1iZmY4LTRmODctYTlkNy04MjJjYWM4ZDVjMjkifSwid2FybmFmdGVyIjoxNjkwNDQ2NTI1fSwibmJmIjoxNjkwNDQyOTE4LCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6bW9uaXRvcmluZzpwcm9tZXRoZXVzLWs4cyJ9.D3a7b93ZnBrmM-hjFrklce8upr8gUhUYYwmjGzZKOKb4EWUCoQXY1p197UoViUmYzbiOhchbehKosFcOjiL2GVGXqDRIXPmFU9p8l80Z9fuilB2TmexB6uBavuEF6blKHkH0VjyVQ3Kg39WzjD0Atrw-G6N4QZ_m0TOcKFfqRPebbH-Q-vzz5UuNPUYRKF4XZIT84QqYLYiBOkkeFIS_abo18YddMbn2AZQcbWamxQV2XPXjNKKwHeQvP1Xdr4hZLt0oGudE2XZtQp60ZCrfDmQteh-KhMWRvsZpoNvE4n8HieAhTTrFq_TjjX9IHlXrPmcONAkQ33jVgRIaw_r_0g
export TOKEN="Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImE3N2JhOGMwY2FjYWEwNDk0MWU4MWM0ODk1Y2JiZjBiOTU2NTA1OTYifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjIl0sImV4cCI6MTcyMTk3ODkxOCwiaWF0IjoxNjkwNDQyOTE4LCJpc3MiOiJodHRwczovL29pZGMuZWtzLmNuLW5vcnRoLTEuYW1hem9uYXdzLmNvbS5jbi9pZC9DMEE5NzJGNERCMThBOTMxN0RBMzk0Q0MwRDMzMjU3RiIsImt1YmVybmV0ZXMuaW8iOnsibmFtZXNwYWNlIjoibW9uaXRvcmluZyIsInBvZCI6eyJuYW1lIjoicHJvbWV0aGV1cy1rOHMtMCIsInVpZCI6ImE4YzdkMGY2LWUyMmEtNGY2Ny04NzYzLWNiNGQwYzM5MWFlMCJ9LCJzZXJ2aWNlYWNjb3VudCI6eyJuYW1lIjoicHJvbWV0aGV1cy1rOHMiLCJ1aWQiOiJmN2M3YWMzZC1iZmY4LTRmODctYTlkNy04MjJjYWM4ZDVjMjkifSwid2FybmFmdGVyIjoxNjkwNDQ2NTI1fSwibmJmIjoxNjkwNDQyOTE4LCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6bW9uaXRvcmluZzpwcm9tZXRoZXVzLWs4cyJ9.D3a7b93ZnBrmM-hjFrklce8upr8gUhUYYwmjGzZKOKb4EWUCoQXY1p197UoViUmYzbiOhchbehKosFcOjiL2GVGXqDRIXPmFU9p8l80Z9fuilB2TmexB6uBavuEF6blKHkH0VjyVQ3Kg39WzjD0Atrw-G6N4QZ_m0TOcKFfqRPebbH-Q-vzz5UuNPUYRKF4XZIT84QqYLYiBOkkeFIS_abo18YddMbn2AZQcbWamxQV2XPXjNKKwHeQvP1Xdr4hZLt0oGudE2XZtQp60ZCrfDmQteh-KhMWRvsZpoNvE4n8HieAhTTrFq_TjjX9IHlXrPmcONAkQ33jVgRIaw_r_0g"
curl -k -H "$TOKEN" https://127.0.0.1:10250/metrics
Neovim 全 Lua 配置
写这个是为了记录一下我新的VIM配置和VIM的快捷键,看起来lua的版本比之前的scripts要好的多, 无论是使用的方式还是启动的速度, 都比之前快。
我的需求:
打开代码, 会显示代码高亮。
vim可以默认满足的要求, 尽可能少的使用鼠标。
代码错误提示 LSP , 挂了Language Server. ( Already Config, but not work. Thinking About this.
主题, 目前使用的是 catppuccin-frappe
Markdown Preview ( Pending….
代码补全(Already Done.
我的快捷键清单:
Mappings
Actions
<Leader-1>
高亮第 1 列, 高亮列, 首字母缩进检查
<Leader-2>
高亮第 3 列, 高亮列, 双空格缩进检查
<Leader-3>
高亮第 5 列, 高亮列, 4空格缩进检查
<Leader-4>
高亮第 9 列, 高亮列, 8空格缩进检查
<Leader-a>
搭配Visual block mode 进行bash shell 的注释,行首添加#
<Leader-x>
同上,删除注释。
<Leader-r>
KubeApply (Fixed, Ready to use.)
<Leader-e>
KubeDelete (Fixed, Ready to use.)
<Leader-dr>
KubeApplyDIr (Fixed, Ready to use.)
<Leader-de>
KubeDeleteDir (Fixed, Ready to use.)
<Leader-ff>
Telescope Find FIles 查找文件
<Leader-fg>
Telescope Find Live grep 过滤文件中的关键字
<Leader-fb>
Telescope Find Buffer 查看Buffer中的数据。VIMbuffer
<Leader-fh>
Telescope Find Help( Maybe not use, Just record
<Leader-ps>
This is Alias for :PackerSync.
<Leader-ms>
This is Alias for :Mason.
<C-n>
Telescope PageDown 在Insert模式下面的上下移动。
<C-p>
Telescope PageUp 在Insert模式下面的上下移动。
<j / k>
Telescope NORMAL Up/Down Normal模式下的上下移动。
<C-x>
Telescope Go to file selection as a split 找到的文件直接水平开新窗口(下方
<C-v>
Telescope Go to file selection as a vsplit 找到的文件直接垂直开新窗口(右侧
<C-t>
Telescope Go to a file in a new tab 找到的文件开新的VIM tab, 感觉不是非常的好用,垂直会经常被用到。
<C-/>
Telescope Show mappings for picker actions (insert mode) 帮助
?
Telescope Show mappings for picker actions (normal mode) 帮助
<M-f>
Scroll left in results window
<M-b>
Scroll right in results window
其他的还在配置和学习中, 先这样把。。 之前用的功能不太多, 有时间继续看。。。。
About NerdFonts.Nerd 类型的字体实际代表了 带有Icon字符集的字体。https://www.nerdfonts.com/#home
其他技巧
不换行显示文本或者代码
set nowrap
直接grep文本的内容并替换当前buffer中的内容.是的,当前打开的文件在VIM里面其实是叫buffer, 因为并未完成实际的写入。
:%! grep KEYWORD
粘贴的时候保留格式。
set paste
set nopaste
或者是关闭autoindent
set ai
set noai
压缩多个空格为一个
:%s@ *@ @g
替换所有的空格 为 tab
:% s@ @\t@g
Linux 路由表以及多网卡路由策略
在EC2实例中, 可以使用多个不同的网卡, 但是虚拟网卡其实是共享实例整体带宽的。 假如EC2实例本身有10Gbps的带宽, 那么无论多少个网卡都应该只能有10Gbps的带宽, 其实添加了多个也不会扩展网络容量上限。但是某些大规格的实例会有这种情况, 需要添加多个网卡,并且底层提供了多个NetworkCard。 这种情况少见, 但是确实有。如果是物理的机器, 那么最好的办法就是链路聚合, 将多个网卡合并使用来扩充这个物理服务器的网络能力。
环境一台ec2 , 三张网卡, OS是 Ubuntu 18.04 , 三张网卡分别是 ens5 ens6 ens7 , 实例中命令展示网卡如下 :
root@ip-172-31-43-121:~# ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 02:4d:73:35:16:8a brd ff:ff:ff:ff:ff:ff
inet 172.31.43.121/20 brd 172.31.47.255 scope global dynamic ens5
valid_lft 1957sec preferred_lft 1957sec
3: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 02:5d:02:b4:37:fa brd ff:ff:ff:ff:ff:ff
inet 172.31.37.95/20 brd 172.31.47.255 scope global dynamic ens6
valid_lft 1955sec preferred_lft 1955sec
4: ens7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 02:cf:10:d8:12:80 brd ff:ff:ff:ff:ff:ff
inet 172.31.40.130/20 brd 172.31.47.255 scope global dynamic ens7
valid_lft 1956sec preferred_lft 1956sec
三张网卡中, ens5 上面有一个公网 ip 地址的绑定, 操作系统看不到, 但是 ens5 能找到公网IP地址, 其他网卡都不能。 弹性IP地址 以及 VPC 寻址 就是这么做的。
多网卡路由策略配置多网卡的情况下,手动配置了所有网卡的路由策略之后,公网访问没了, 看看 ip route show:查看路由表:
root@ip-172-31-43-121:~# ip r s
default via 172.31.32.1 dev ens7 proto dhcp src 172.31.40.130 metric 100
default via 172.31.32.1 dev ens6 proto dhcp src 172.31.37.95 metric 100
default via 172.31.32.1 dev ens5 proto dhcp src 172.31.43.121 metric 100
172.31.32.0/20 dev ens7 proto kernel scope link src 172.31.40.130
172.31.32.0/20 dev ens6 proto kernel scope link src 172.31.37.95
172.31.32.0/20 dev ens5 proto kernel scope link src 172.31.43.121
172.31.32.1 dev ens7 proto dhcp scope link src 172.31.40.130 metric 100
172.31.32.1 dev ens6 proto dhcp scope link src 172.31.37.95 metric 100
172.31.32.1 dev ens5 proto dhcp scope link src 172.31.43.121 metric 100
ip route show 命令显示的是系统路由表,也就是记录了目的网络和下一跳地址的信息的路由表。它的每个字段的含义是:
default 表示这个路由项是一个默认路由,也就是当没有匹配目的地址的路由项时,就使用这个路由项来发送数据包。
via 表示这个路由项的下一跳地址,也就是数据包要经过的网关地址。
dev 表示这个路由项对应的网卡设备名称,例如 lo, eth0, ens5 等。
proto 表示这个路由项的协议来源,例如 kernel, static, dhcp 等。
src 表示这个路由项的源地址,也就是本机发送数据包时使用的IP地址。
metric 表示这个路由项的度量值,也就是到达目的网络所需的跳数或开销。
这里面显示 我有三个默认路由, 他们的权重是一样的, 那么按照通常的逻辑, 哪个条目在靠前就会把数据包交给谁, 这时候问题出现了。如果我的主网卡上面有公网IP地址, 这时候我去访问公网例如 baidu, 会发现这个数据是出不去的, 因为默认匹配了第一个条目之后,数据从 ens7 这个没有公网ip地址绑定的网卡走了。
抓包验证一下:测试一下, 直接开一个Ping命令在后台, ping www.baidu.com , 另一个窗口开 tcpdump -i any icmp看结果。
root@ip-172-31-43-121:~# ping www.baidu.com &
root@ip-172-31-43-121:~# tcpdump -nni any icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
14:49:31.480896 IP 172.31.40.130 > 39.156.66.14: ICMP echo request, id 15074, seq 12, length 64
14:49:32.504867 IP 172.31.40.130 > 39.156.66.14: ICMP echo request, id 15074, seq 13, length 64
14:49:33.528873 IP 172.31.40.130 > 39.156.66.14: ICMP echo request, id 15074, seq 14, length 64
14:49:34.552872 IP 172.31.40.130 > 39.156.66.14: ICMP echo request, id 15074, seq 15, length 64
14:49:35.576877 IP 172.31.40.130 > 39.156.66.14: ICMP echo request, id 15074, seq 16, length 64
14:49:36.600873 IP 172.31.40.130 > 39.156.66.14: ICMP echo request, id 15074, seq 17, length 64
14:49:37.624863 IP 172.31.40.130 > 39.156.66.14: ICMP echo request, id 15074, seq 18, length 64
14:49:38.648871 IP 172.31.40.130 > 39.156.66.14: ICMP echo request, id 15074, seq 19, length 64
14:49:39.672865 IP 172.31.40.130 > 39.156.66.14: ICMP echo request, id 15074, seq 20, length 64
14:49:40.696876 IP 172.31.40.130 > 39.156.66.14: ICMP echo request, id 15074, seq 21, length 64
14:49:41.720872 IP 172.31.40.130 > 39.156.66.14: ICMP echo request, id 15074, seq 22, length 64
14:49:42.744873 IP 172.31.40.130 > 39.156.66.14: ICMP echo request, id 15074, seq 23, length 64
14:49:43.768868 IP 172.31.40.130 > 39.156.66.14: ICMP echo request, id 15074, seq 24, length 64
能直接看到这个数据包是从 ens7 的网卡出去的, 确实匹配到了默认的路由条目, 第一条直接发走, 这本来是正确的逻辑, 但是一旦我需要访问公网且该实例的 ens5 才是公网ip的指定网卡, 那么这个数据包就只有出去, 没有回来的了。
调整路由条目的优先级调整默认路由的优先级, 让数据匹配默认路由的时候优先匹配ens5的条目。
150 ip route del default via 172.31.32.1 dev ens5 proto dhcp src 172.31.43.121 metric 100
151 ip route add default via 172.31.32.1 dev ens5 proto dhcp src 172.31.43.121 metric 10
上面的命令可以将ens5 的默认路由metric 设置成 10 ,整体的路由表会变成这样:
root@ip-172-31-43-121:/etc/netplan# ip r s
default via 172.31.32.1 dev ens5 proto dhcp src 172.31.43.121 metric 10
default via 172.31.32.1 dev ens7 proto dhcp src 172.31.40.130 metric 100
default via 172.31.32.1 dev ens6 proto dhcp src 172.31.37.95 metric 100
172.31 ...
Linux配置网卡策略路由
会遇到Linux多个网卡的时候, 网络并不会保证源地址进网卡 , 源地址出网卡。
大佬说, IP地址的其实关联的是操作系统,并不是特定的网卡, 所以对于os来说, 邻居子系统会选择一下网络数据从哪个物理网卡出。
这样就会导致,数据包会在网卡之间Forward一下,而转发出来的数据包, 会被aws vpc 丢包, 因为出入栈的地址不一样了。
对于这个行为, 需要配置操作系统的路由策略来解决, 让流量从相同的网卡进出。
记录一下这个配置。
UbuntuUbuntu 直接使用的netplan ,在配置文件里面直接指定policy就可以了。
配置文件位置: /etc/netplan/*
配置文件内容大致如下:
:~# cat /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by the datasource. Changes
# to it will not persist across an instance reboot. To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
ethernets:
ens4:
dhcp4: true
dhcp6: false
match:
macaddress: 02:ab:8e:b1:ba:36
set-name: ens4
routes:
- to: 0.0.0.0/0
via: 172.31.48.1
table: 1000
- to: 172.31.51.248
via: 0.0.0.0
scope: link
table: 1000
routing-policy:
- from: 172.31.51.248
table: 1000
ens6:
dhcp4: true
dhcp6: false
match:
macaddress: 02:64:69:51:00:f2
set-name: ens6
routes:
- to: 0.0.0.0/0
via: 172.31.48.1
table: 1001
- to: 172.31.59.199
via: 0.0.0.0
scope: link
table: 1001
routing-policy:
- from: 172.31.59.199
table: 1001
version: 2
Redhat/CentOS/Fedora/AmazonLinux2旧方式设置设置开机配置路由的方式, 使用旧脚本得方式需要禁用NetworkManager,完全手动配置networkd的脚本。
安装旧的脚本管理工具
yum install -y network-scripts
确认配置文件是否正确
[root@ip-172-31-11-110 network-scripts]# ll
total 244
-rw-r--r--. 1 root root 174 Dec 17 12:30 ifcfg-eth0
-rw-r--r--. 1 root root 278 Dec 17 15:56 ifcfg-eth1
-rw-r--r--. 1 root root 254 Feb 15 2021 ifcfg-lo
-rwxr-xr-x. 1 root root 2123 Feb 15 2021 ifdown
-rwxr-xr-x. 1 root root 646 Feb 15 2021 ifdown-bnep
-rwxr-xr-x. 1 root root 6419 Feb 15 2021 ifdown-eth
-rwxr-xr-x. 1 root root 769 Feb 15 2021 ifdown-ippp
-rwxr-xr-x. 1 root root 4536 Feb 15 2021 ifdown-ipv6
lrwxrwxrwx. 1 root root 11 Feb 15 2021 ifdown-isdn -> ifdown-ippp
-rwxr-xr-x. 1 root root 2064 Feb 15 2021 ifdown-post
-rwxr-xr-x. 1 root root 870 Feb 15 2021 ifdown-routes
-rwxr-xr-x. 1 root root 1458 Feb 15 2021 ifdown-sit
-rwxr-xr-x. 1 root root 1621 Jul 26 2020 ifdown-Team
-rwxr-xr-x. 1 root root 1556 Jul 26 2020 ifdown-TeamPort
-rwxr-xr-x. 1 root root 1462 Feb 15 2021 ifdown-tunnel
-rwxr-xr-x. 1 root root 5463 Feb 15 2021 ifup
-rwxr-xr-x. 1 root root 12270 Feb 15 2021 ifup-aliases
-rwxr-xr-x. 1 root root 906 Feb 15 2021 ifup-bnep
-rwxr-xr-x. 1 root root 13776 Feb 15 2021 ifup-eth
-rwxr-xr-x. 1 root root 12068 Feb 15 2021 ifup-ippp
-rwxr-xr-x. 1 root root 11891 Feb 15 2021 ifup-ipv6
lrwxrwxrwx. 1 root root 9 Feb 15 2021 ifup-isdn -> ifup-ippp
-rwxr-xr-x. 1 root root 643 Feb 15 2021 ifup-plip
-rwxr-xr-x. 1 root root 1057 Feb 15 2021 ifup-plusb
-rwxr-xr-x. 1 root root 5000 Feb 15 2021 ifup-post
-rwxr-xr-x. 1 root root 2001 Feb 15 2021 ifup-routes
-rwxr-xr-x. 1 root root 3303 Feb 15 2021 ifup-sit
-rwxr-xr-x. 1 root root 1755 Jul 26 2020 ifup-Team
-rwxr-xr-x. 1 root root 1876 Jul 26 2020 ifup-TeamPort
-rwxr-xr-x. 1 root root 2879 Feb 15 2021 ifup-tunnel
-rwxr-xr-x. 1 root root 1836 Feb 15 2021 ifup-wireless
-rwxr-xr-x. 1 root root 5421 Feb 15 2021 init.ipv6-global
-rw-r--r--. 1 root root 20431 Feb 15 2021 network-functions
-rw-r--r--. 1 root root 31037 Feb 15 2021 network-functions-ipv6
-rw-r--r--. 1 root root 40 Dec 17 16:00 route-eth0
-rw-r--r--. 1 root root 40 Dec 17 16:00 route-eth1
-rw-r--r--. 1 root root 28 Dec 17 15:40 rule-eth0
-rw-r--r--. 1 root root 28 Dec 17 15:41 rule-eth1
书写文件内容,需要配置的文件如下:
[root@ip-172-31-11-110 network-scripts]$ cat ifcfg-eth0
# Created by cloud-init on instance boot automatically, do not edit.
#
BOOTPROTO=dhcp
DEVICE=eth0
HWADDR=02:20:22:29:a4:0c
ONBOOT=yes
STARTMODE=auto
TYPE=Ethernet
USERCTL=no
[root@ip-172-31-11-110 network-scripts]$ cat ifcfg-eth1
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth1
UUID=80caddf5-1347-4246-827e-5e0146c7f2c5
DEVICE=eth1
ONBOOT=yes
[root@ip-172-31-11-110 network-scripts]$ cat route-eth0
default via 172.31.0.1 dev eth0 table 1
[root@ip-172-31-11-110 network-scripts]$ cat route-eth1
default via 172.31.0.1 dev eth1 table 2
[root@ip-172-31-11-110 network-scripts]$ cat rule-eth0
from 172.31.11.110 lookup 1
[root@ip-172-31-11-110 network-scripts]$ cat rule-eth1
from 172.31.11.124 lookup 2
[root@ip-172-31-11-110 network-scripts]# cat /etc/iprout ...
Git常见的命令
远端创建, Clone本地Step 1Github上面创建一个新的仓库, 页面创建即可, 然后记录下URL。
https://github.com/LiarLee/vps-init.git
Step 2本地创建目录, 并初始化本地的仓库路径。
mkdir project-init
cd ./project-init
git clone https://github.com/LiarLee/project-init.git
关联远端仓库创建一个本地仓库。
mkdir test-init
cd ./test-init
git init .
touch README
echo "For test"
git add -A
git commit -m "init"
git remote add origin https://github.com/LiarLee/test-init.git
git -u origin master
配置代理# 设置代理
arch ~> git config --global http.proxy socks5://1.1.1.1:7890
arch ~> git config --global https.proxy socks5://1.1.1.1:7890
# 取消代理
git config --global --unset http.proxy git config --global --unset https.proxy
取消 git 特定文件追踪最好的办法是直接使用gitignore忽略这个文件, 但是开始创建仓库的时候可能想不到, 所以已经追踪的文件需要取消。
查看这个哪些文件会受到影响:
git rm -r -n --cached ./plugin
删除这些文件的追踪:
git rm -r --cached ./plugin
Linux Redhat 9 oom不触发
测试环境Amazon AMI ID: ami-0e54fe8afeb8fa59a
Operating System: Red Hat Enterprise Linux 9.2 (Plow)
Kernel: Linux 5.14.0-284.11.1.el9_2.x86_64
MySQL Version: Ver 8.0.33 for Linux on x86_64 (MySQL Community Server - GPL)
测试步骤:
使用上面的AMI启动一个新的实例, 在实例启动之后ssh连接进去。
按照MySQL官方的 repo 安装一个社区的版本。
# https://dev.mysql.com/downloads/repo/yum/
# (mysql80-community-release-el9-1.noarch.rpm)
wget https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
dnf install -y ./mysql80-community-release-el9-1.noarch.rpm
dnf makecache -y
dnf update -y
# Refer this doc to install mysql-community packages.
# https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html
dnf install -y mysql-community-server
# Check the installation success.
systemctl status mysqld
编辑MySQL配置文件, 添加如下的参数:
vim /etc/my.cnf
#设置buffer pool 的参数大于物理内存。 例如 os 本身由可用的内存是 16G, 那么设置一个更大的值即可。
innodb_buffer_pool_size = 40G
sudo systemctl enable --now mysqld
sudo systemctl status mysqld
# 获取root用户的临时初始化密码:
sudo grep 'temporary password' /var/log/mysqld.log
# 使用root用户登录, 并查看配置已经生效。
mysql -u root -p
MySQL [(none)]> show variables like "%buffer_pool_size%";
+-------------------------+-------------+
| Variable_name | Value |
+-------------------------+-------------+
| innodb_buffer_pool_size | 42949672960 |
+-------------------------+-------------+
1 row in set (0.005 sec)
创建database 以及 table:
create database test;
CREATE TABLE tt1(
id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
person_id tinyint not null ,
person_name1 VARCHAR(3000) ,
person_name2 VARCHAR(3000) ,
person_name3 VARCHAR(3000) ,
person_name4 VARCHAR(3000) ,
person_name5 VARCHAR(3000) ,
gmt_create datetime ,
gmt_modified datetime
) ;
insert into tt1 (person_id, person_name1, person_name2, person_name3, person_name4, person_name5, gmt_create, gmt_modified)
values (1, lpad('',3000,'*'), lpad('',3000,'*'), lpad('',3000,'*'), lpad('',3000,'*'), lpad('',3000,'*'), now(), now());
# 反复执行这个命令, 复制全表的数据, 大概执行 10 次左右。
insert into tt1 (person_id, person_name1, person_name2, person_name3, person_name4, person_name5, gmt_create, gmt_modified)
select person_id, person_name1, person_name2, person_name3, person_name4, person_name5, now(), now() from tt1;
# 查看当前table的信息 ,确认一下数据量。
show table status like 'tt1'\G
在另一个机器上面 select 这个表格。
select count(*) from tt1;
如果数据量足够大的话, 那么就会占用超过物理内存的空间,导致OOM。
问题其他版本的os上面都会触发oom, 然后MySQL会被干掉重启, 只有Redhat 9 这个版本的os是不会触发的。
测试了Ubuntu 22, amazonlinux2, amazonlinux2023 都没由这个问题, 他们的内核都是 5.10+ 。
Redhat 9 这个版本的表现是, 在接近物理内存容量极限的时候, os 开始非常频繁的扫描并尝试回收内存的空间, 导致命令的响应变慢,我开了sar的监控命令,返回数据的速度也会便的比较慢, 大部分的进程会慢慢变成 Uninterreptable状态, 并且数量越来越多, 最终会导致实例的网络子系统不工作, 完全不响应任何的网络报文,实例的健康检查失败。CPU使用率依旧还在, EBS的监控显示这个卷满速度读取输出, 并且非常平稳, 响应时间以及队列的长度也没有异常。
如果这个时候尝试取手动触发oom, 是可以成功的, 在杀掉Mysqld之后, os就恢复了正常。
分析思路可以确定的是 磁盘的工作是正常的, CPU使用率慢慢增长但是也是正常的。 这部分的工作没有问题。
在发生问题的时候因为网络无法正常的工作,ssh已经断开, 无法确定当时的情况。
初步判断是内存的问题, 但是具体的差异是哪里。
第一sar命令中的记录
第二尝试对比与行为正常的os的差异, 获取sysctl -a 并记录到文件中。
对比完关于内存部分的参数, 完全没有任何的差别, 不是设置或者配置文件导致的这个问题。
min 水位的设置是默认的, 与其他的发行版本一直, 测试的时候用的相同的规格, 所以不存在这类的差异。
第三触发一个kdump 看看网络不相应的时候 os 当时的状态, 这个不太会。
第四查看内核的编译选项, 看看有什么不同。
第五学习os 内存的部分, 看看具体这个版本的内核如何进行内存的回收的, 或者触发oom的条件有哪些。