Epoll vs select vs poll vs io_uring
select方式:使用fd_set结构体告诉内核同时监控那些文件句柄,使用逐个排查方式去检查是否有文件句柄就绪或者超时。该方式有以下缺点:文件句柄数量是有上限的,逐个检查吞吐量低,每次调用都要重复初始化fd_set。 poll方式:该方式主要解决了select方式的2个缺点,文件句柄上限问题(链表方式存储)以及重复初始化问题(不同字段标注关注事件和发生事件),但是逐个去检查文件句柄是否就绪的问题仍然没有解决。 epoll方式:该方式可以说是C10K问题的killer,他不去轮询监听所有文件句柄是否已经就绪。epoll只对发生变化的文件句柄感兴趣。其工作机制是,使用”事件”的就绪通知方式,通过epoll_ctl注册文件描述符fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd, epoll_wait便可以收到通知, 并通知应用程序。而且epoll使用一个文件描述符管理多个描述符,将用户进程的文件描述符的事件存放到内核的一个事件表中, 这样数据只需要从内核缓存空间拷贝一次到用户进程地址空间。而且epoll是通过内核与用户空间共享内存方式来实现事件就绪消息传递的...
关于内核Config中的参数 CONFIG_NO_HZ
关于Tick, Tickless的研究。 https://www.kernel.org/doc/html/latest/timers/no_hz.html 这几个参数的最终意义都和 Jitter 相关, 设置的参数含义是 : CPU时钟中断的周期, 如果是 100HZ , 那么1s的时间内CPU会中断100次。目前最新的内核支持 NOHZ , 也就是在没有任务的时候处于节能的考虑不进行中断。当有需要运行的业务时还是会正常的触发CPU中断。NOHZ主要的功能时省电, 调整这个参数的意义就是让CPU处在合理的中断次数。过多的中断会导致相关的任务被打断。 git://git.kernel.org/pub/scm/linux/kernel/git/frederic/dynticks-testing.git
Nginx Performance Test
写在最前面, 这个问题还在研究中, 我目前还没有合适的模型用来研究这个问题, Pending…. Nginx 性能测试与压力计算使用al2023 + 默认的yum仓库软件版本, 具体信息记录如下: 按照下面的配置, 在Nginx上面发布一个目录, 其中放了一个Fedora镜像, 大小大约2.3GB, 固定Nginx处理请求的大小, 控制大部分的因素来尝试获取精确的结果。 OS Version 12345678910111213[root@ip-172-31-53-146 ~]# cat /etc/os-releaseNAME="Amazon Linux"VERSION="2023"ID="amzn"ID_LIKE="fedora"VERSION_ID="2023"PLATFORM_ID="platform:al2023"PRETTY_NAME="Amazon Linux 2023"ANSI_COLOR="0;33"C...
OOM行为
关于OOM行为的思考 以及Kswapd的动作和行为。http://evertrain.blogspot.com/2018/04/oom.html更详细的打分算法见源码 https://github.com/torvalds/linux/blob/master/mm/oom_kill.c 发生之后OOM killer会将kill的信息记录到系统日志/var/log/messages,检索相关信息就能匹配到是否触发。 1grep 'Out of memory' /var/log/messages 也可以通过dmesg 1dmesg -Tx | egrep -i 'killed process' 查看分数最高的进程1234567#!/bin/bashfor proc in $(find /proc -maxdepth 1 -regex '/proc/[0-9]+'); do printf "%2d %5d %s\n" \ "$(cat $pro...
Perf 命令的Performance分析
https://blog.gmem.cc/perf 一个非常详细的博客, 太强啦。 使用perf进行性能的简单输出12345678910111213141516root@ip-172-31-11-235:~|⇒ perf stat htop -d 1 Performance counter stats for 'htop -d 1': 181.764747 task-clock (msec) # 0.055 CPUs utilized 52 context-switches # 0.286 K/sec 0 cpu-migrations # 0.000 K/sec 320 page-faults # 0.002 M/sec <not supported> cycles <no...
sysctl 参数笔记
一些关于sysctl参数设置的收集和解释。 /etc/sysctl.d/00-defaults.confkernel.printk输出内核日志信息的级别。 12345678# 映射到的proc文件系统位置 - /proc/sys/kernel/printk# Maximize console logging level for kernel printk messageskernel.printk = 8 4 1 7# (1) 控制台日志级别:优先级高于该值的消息将被打印至控制台。# (2) 缺省的消息日志级别:将用该值来打印没有优先级的消息。# (3) 最低的控制台日志级别:控制台日志级别可能被设置的最小值。# (4) 缺省的控制台:控制台日志级别的缺省值。 内核中共提供了八种不同的日志级别,在 linux/kernel.h 中有相应的宏对应。 12345678#define KERN_EMERG "<0>" /* systemis unusable */#define KERN_ALERT &qu...
btrfs 笔记
学习btrfs文件系统笔记. btrfs 管理模式和标准的文件系统不同。 btrfs 的顶级卷可以理解为 存储池, 跨越多个设备添加所有的空间到顶级卷。在顶级卷中可以直接创建目录结构进行使用, 但是并不推荐。推荐的方式是在顶级卷下面创建子卷, 然后挂载子卷使用, 这样可以最大程度的发挥 btrfs 文件系统的高级特性。子卷可以和标准目录使用 ls 命令输出没有任何差异, 为了在更好的区分 子卷 还是 普通目录, 在创建子卷的时候使用 @VOLUME_NAME 的格式进行创建。 ^3e41e6 例如: 123456/mnt/btrfs/ <-- 这一层还是 xfs 文件系统的范围,下面的三个目录都是手动创建的挂载点|-- docker_data <-- 在这里挂载 @docker_data|-- harbor_data <-- 在这里挂载 @harbor_data`-- root <-- 在这里挂载 btrfs top volume, subvolume=/ |-- @docker_data <-- 在这里创建 btrfs subvo...
Fio 命令说明
FIO (Flexible I/O Tester) 是一款功能强大的磁盘性能测试工具,可用于对存储系统进行各种测试和评估。 Github地址 https://github.com/axboe/fio https://tobert.github.io/post/2014-04-17-fio-output-explained.html http://xiaqunfeng.cc/2017/07/12/fio-test-ceph/ https://fio.readthedocs.io/en/latest/fio_doc.html http://linuxperf.com/?p=156 使用说明1234567891011121314151617181920212223242526272829# fio test file defination# ini file format ; -- start job file --[global]size=1G # 设置测试文件的大小runtime=30 # 设定运行时间, 如果运行时间之内已经完成了文件大小的写入则会保持文件大...
Shell脚本处理目录或者文件名中的空格
问题:问题是: 罗列指定的目录下面的文件, 符合要求的文件保留, 未匹配的删除。 解决:简单的Bash脚本, 使用ls拿文件名, 使用For + IF判断即可。但是文件的目录中有的文件名是带有空格的, 而Shell 使用空格做分隔符,因此无法正确的处理完整的文件名。解决方案有特别多, 只记录一个我最后使用的方案:使用IFS变量来定义Shell 的默认分隔符, 将空格替换成\n\b. 1234567891011121314151617181920#!/bin/bash#SAVEIFS=$IFSIFS=$(echo -en "\n\b")for number in {1..10}do mkdir -pv "dir $number"donetreeFILE=`ls`for i in $FILE;do echo "The DirName: $i"doneIFS=$SAVEIFS 这样就可以拿到名称为dir 1的完整目录名字了,否则会默认吧空格分割的文件名称作为两个目录提取。 123456789101...
Linux中一些常见的性能分析命令
记录性能分析的思路。 最近的这个半年越来越好奇的事情是, 为什么命令会卡住,为什么命令会执行不下去,为什么命令会等待,等等等等。 那么这些问题, 有的是可以有答案的, 目前也不知道的。 已经大概掌握的几个不同的方法以及观测的工具, 大概做一个记录。 Strace命令Strace 命令的常见用法strace命令是用来追踪系统调用的,常见的可以追踪的系统调用需要阅读内核部分的代码。 但是常见的系统调用就是集中, read() , write() , ioctl(), futex() , mmap()大部分的时候 我们都是可以观测到卡住的部分的 , 这种追踪我认为常见的使用场景就是命令卡住了, 或者执行中的程序卡住了。 命令卡住的分析对于命令卡住的情况, 可以使用类似于如下的命令: 1strace -f -ttt -s 512 echo "123" 这样的话, 在执行的过程中就可以查看相关的内容,比如常见的卡在了系统调用的某个函数上, 这个可以用来定位,命令打开了那些文件,申请的那些内存地址,打开了什么文件,关闭Socket等等等等。目前我的办法的通过对比这个...

