内存, mem

内存, mem 内存对于缓存更新策略,要区分Write-Through和Write-Back两种策略。前者更新内容直接写内存并不同时更新Cache,但要置Cache失效,后者先更新Cache,随后异步更新内存。通常X86 CPU更新内存都使用Write-Back策略。 虚拟内存 虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存 (一个连续完整的地址空间) ,而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存 (例如RAM) 的使用也更有效率。 注意: 虚拟内存不只是「用磁盘空间来扩展物理内存」的意思——这只是扩充内存级别以使其包含硬盘驱动器而已。把内存扩展到磁盘只是使用虚拟内存技术的一个结果,它的作用也可以通过覆盖或者把处于不活动状态的程序以及它们的数据全部交换到磁盘上等方式来实现。对虚拟内存的定义是基于对地址空间的重定义的,即把地址空间定义为「连续的虚拟内存地址」,以借此「欺骗」程序,使它们以为自己正在使用一大块的「连续」地址。 为什么要使用虚拟内存 a. 产生的背景 (摘自书籍Rechnerarchitektur : Von der digitalen Logik zum Parallelrechner 作者Andrew S. Tanenbaum )早期的计算机内存容量非常小,通常只能存储几千个Wörter 1(即数据单元),但价格却是十分昂贵。(之后的Beispiele是指一些关于早期计算机的具体例子) 所造成的不便: a. 使用这些容量很小的内存,导致了程序运行的速度很慢,原因是在于存放相对高效的算法需要占用的内存空间相对较大,所以程序员们只能使用执行效率较低的,但是占用内存容量较小的算法。à对于这个问题的传统解决方案是,(物理上,或者说在硬件上)新增加一个(或多个)内存空间(例如,硬盘- Plattenspeicher)。b. 而同时还造成的一个不便之处,是在这种内存容量很小的情况下,程序员需要人为地将程序分解成为多个部分(Overlays), 然后分开来存储进内存中。在执行程序时,就首先执行第1个Overlay, 执行完毕后,继而调用第2个Overlay,以此类推。à进展:尽管这个方法在那个时代已经很广泛地普及化了,但是由于使用Overlay进行管理执行程序的办法需要大量的人力投入,这其中的成本仍是不容小觑的。于是在1961年,一位来自英国曼彻斯特的研究人员提议,不如将程序通过Overlays执行这个方法设计成自动化的模式,这样就无需程序员费劳管理程序的划分与安置的任务。这个新的方法所使用到的一个新的概念即是虚拟内存virtueller Speicher。b.使用虚拟内存的优势: (摘自https://blog.csdn.net/vernice/article/details/41783601) 1 程序员无需操心如何存储(数据,程序等等的)内容。2 通过分布在同一个物理内存空间的两个不同的区间,虚拟内存里的数据和程序可以彼此共享使用3 它使得应用程序在系统中可以更自如地在物理地址中被执行。虚拟内存的操作过程是怎么样的 假如说这台机器不适用虚拟内存这个概念,那么程序就会报错,例如"该指定的地址范围在内存中不存在",继而程序终止执行。而反过来若是这台机器是适用虚拟内存的,那么这个任务会按照如下步骤来执行: 1 寻找位于存储盘上,介于地址8192和12287之间的数据单元。2 将这段原来地址为8192~12287的数据单元加载到内存中。3 而这段数据对应到内存中的地址将被定义为0~4095。4 而程序将继续正常地执行下去。 人们将这项自动划分区间(Overlays)的技术命名为Paging (deuts. Seitenauslagerung),而这一段段从硬盘中读出来的程序区间即被命名为Page (deuts. Seiten)。 虚拟地址通过对虚拟地址空间到物理地址空间的一个动态映射来实现。而虚拟的地址空间也会相应地划分成Pages, 然后整个虚拟地址空间就相当于一张划分地址空间的表格,与实际的物理内存地址相互对应。 (只是这个图像的内存中没有包含多个4KB的内存空间,而是指设置了一个,所以这个具例中,我们只能一次对应一个4KB的空间。) 而这个对应的关系实际上也可以更为的复杂,这是完全可以做到的。我们一方面将存储程序的地址称为虚拟地址空间Adressraum (Virtual Address Space),另一方面将真正存在的,有线路控制的内存地址称作物理地址空间(Physical Address Space)。依据对应的物理地址空间规划虚拟地址空间上的内容区划。这里我们假设首先是有足够的空间来装得下虚拟的地址空间的。这样人们就会获得一种假象,这种假象会让人感到好像有十分充足的(物理)内存空间一样,但实际上这些都是因为虚拟内存这个概念的应用,而现实中物理内存的实际容量远远少于人们所需要的。 有了这个优势,程序就可以任意地将虚拟地址空间里的数据加载出来,或者将新的数据存储到虚拟的内存空间中去,而人们也完全无需去顾虑是否物理内存的容量是否够用。 (有的)程序员甚至可以完全不需要知道虚拟内存的存在。计算机于是看上去是有一个很大很大的内存的。 而实现虚拟内存的一个本质前提是要有一个可以存放整个程序和数据的硬盘。这一个硬盘可以是可以转动的那种硬盘,也可以是固态硬盘。在书中我们统一将"Platte"或者说"Festplatte" 理解为固态硬盘。(将存在硬盘里的程序作为原件,而将程序数据转运到内存中所要做的即是一个复制的功能)自然的,在执行操作后要保持对硬盘里的程序(即原件)的更新。当在内存中原数据的"副本"改变后,反过去就要对硬盘的程序进行改动。 内存管理单元,内存控制单元 (MMU) 什么是MMU MMU(Memory Management Unit)主要用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权、多任务多进程操作系统。 (来自百度百科,对其几个点不熟悉,因此可以只考虑加粗部分) ...

2019-06-11 · 6 min · 1192 words · -

shell basic, shell script, shell 脚本

shell basic, shell script sample #!/usr/bin/env bash echo 'hello world' commands # to refresh your current bash session exec bash Shell 函数, function # 参数不在函数名后面的括号里定义 [ function ] funname [()] { action; [return int;] } # 定义函数 fun0 fun0(){ echo "run fun0: " + $1 } # 调用函数 fun0 fun0 "foo" # 定义带参数的函数 fun0 # 在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数... fun0(){ echo "run fun0 $1 " echo "第一个参数为 $1 !" echo "第二个参数为 $2 !" echo "第十个参数为 $10 !" } # 调用带参数的函数 fun0 fun0 foo # check if params is not supplied if [ $# -eq 0 ] then echo "No arguments supplied" fi https://www.runoob.com/linux/linux-shell-func.html ...

2019-05-06 · 15 min · 3013 words · -

bspwm

bspwm https://wiki.archlinux.org/title/bspwm https://zhuanlan.zhihu.com/p/568211941 mkdir ~/.config install -Dm755 /usr/share/doc/bspwm/examples/bspwmrc ~/.config/bspwm/bspwmrc install -Dm644 /usr/share/doc/bspwm/examples/sxhkdrc ~/.config/sxhkd/sxhkdrc 快捷键 win + enter: 打开 urxvt win + space: dmenu_run

2019-04-10 · 1 min · 23 words · -

btrfs

btrfs 禁用 COW chattr +C /path/to/dir/ https://typeblog.net/migrate-to-btrfs/ 数据一致性相关的特性 COW 事务 理解 COW 事务,必须首先理解 COW 和事务这两个术语。 什么是 COW? 所谓 COW,即每次写磁盘数据时,先将更新数据写入一个新的 block,当新数据写入成功之后,再更新相关的数据结构指向新 block 。 什么是事务? COW 只能保证单一数据更新的原子性。但文件系统中很多操作需要更新多个不同的元数据,比如创建文件需要修改以下这些元数据: 修改 extent tree,分配一段磁盘空间 创建一个新的 inode,并插入 FS Tree 中 增加一个目录项,插入到 FS Tree 中 任何一个步骤出错,文件便不能创建成功,因此可以定义为一个事务。 下面将演示一个 COW 事务。 A 是 FS Tree 的根节点,新的 inode 的信息将被插入节点 C 。首先,btrfs 将 inode 插入一个新分配的 block C ‘中,并修改上层节点 B,使其指向新的 block C ‘;修改 B 也将引发 COW,以此类推,引发一个连锁反应,直到最顶层的 Root A 。当整个过程结束后,新节点 A ‘变成了 FS Tree 的根。但此时事务并未结束,superblock 依然指向 A 。 ...

2019-03-30 · 1 min · 85 words · -

diff command

diff command diff 的三种格式 正常格式 上下文格式 合并格式 git 格式 Git’s diff is a variant of unified diff, so unified diff is preferred. # unified diff diff -u foo bar diff 是 Unix 系统的一个很重要的工具程序。它用来比较两个文本文件的差异,是代码版本管理的基石之一。 diff 的三种格式 正常格式(normal diff) 上下文格式(context diff) 合并格式(unified diff) 命令格式 diff [参数] [文件1或目录1] [文件2或目录2] diff -B -b -r --exclude="*.vscode" --exclude="*.svn" /etc/nginx/ /etc/foo-nginx/ diff -r \ --exclude="*~" \ --exclude=".svn" \ --exclude=".git" \ --exclude="*.zip*" \ --exclude="*.gz" \ --exclude="*.tar" \ # -B 或--ignore-blank-lines 不检查空白行。 # -b 或--ignore-space-change 不检查空格字符的不同。 # -r 递归比较子目录中的文件 # -x 或--exclude 不比较选项中所指定的文件或目录。 # -w 或--ignore-all-space 忽略全部的空格字符。 # -q 或--brief 仅显示有无差异,不显示详细的信息。 # -a 将所有的比对文件都当作文本文件处理 比较两个文件 diff foo.log bar.log 3c3 < 2014-03 --- > 2013-03 8c8 < 2013-07 --- > 2013-08 11,12d10 < 2013-11 < 2013-12 说明 3c3 用来说明变动位置, 分为三个部分, 第一个数字表示 foo.log 的第 3 行有变化, 中间的 c 表示变动模式是内容改变 (change), 后面的 3 表示 变动后变成 bar.log 文件的第3行. < 2014-03, 分为两个部分, 前面的小于号表示 foo.log 比 bar.log 少了这一行, 2014-03 是该行的内容 — 分隔线, 用于分隔 foo.log bar.log 2013-03, 大于号表示 bar.log 增加了这行 ...

2019-02-22 · 3 min · 437 words · -

shell 状态代码

shell 状态代码 https://blog.csdn.net/hongkangwl/article/details/16184883 Linux提供 $? 特殊变量来保存最后一条命令执行结束的退出状态。执行完一条命令后,立即执行 echo $?, 可以查看最后一条命令的退出状态值。 正常的情况下,命令成功执行完成的退出状态是0,如果非0,则命令执行有错。 该命令可以用于检查命令是否正确执行,比如在解压包的时候,检查解压包是否成功十分有效。 自定义退出状态码,可以在脚本中定义自己的退出状态代码,然后使用 echo $? 检查。 退出状态码最高是255,一般自定义的代码值为0~255,如果超出255,则返回该数值被256除了之后的余数。 shell 退出状态代码 0 命令成功完成 1 通常的未知错误 2 误用 shell 命令 126 命令无法执行 127 没有找到命令 128 无效的退出参数 128+x 使用Linux信号x的致命错误。 130 使用Ctrl-C终止的命令 255 规范外的退出状态 作者: 王伴农 来源: CSDN 原文: https://blog.csdn.net/hongkangwl/article/details/16184883 版权声明: 本文为博主原创文章,转载请附上博文链接!

2019-01-07 · 1 min · 46 words · -

Console(控制台), Terminal(终端), tty, shell

Console(控制台), Terminal(终端), tty, shell https://blog.csdn.net/on_1y/article/details/20203963 使用 linux 已经有一段时间, 却一直弄不明白这几个概念之间的区别。虽然一直在用, 但是很多概念都感觉模糊不清, 这样不上不下的状态实在令人不爽。下面就澄清一下这些概念。 这些概念本身有着非常浓厚的历史气息, 随着时代的发展, 他们的含义也在发生改变, 它们有些已经失去了最初的含义, 但是它们的名字却被保留了下来。 控制台(Console) 控制台(Console)是物理设备,用于输入输出,它直接连接在计算机上,是计算机系统的一部分。计算机输出的信息会显示在控制台上,例如BIOS的输出,内核的输出。 终端(Terminal) 终端(Terminal)也是一台物理设备,只用于输入输出,本身没有强大的计算能力。一台计算机只有一个控制台,在计算资源紧张的时代,人们想共享一台计算机,可以通过终端连接到计算机上,将指令输入终端,终端传送给计算机,计算机完成指令后,将输出传送给终端,终端将结果显示给用户。 虚拟控制台(Virtual Console),虚拟终端(Virtual Terminal) 虚拟控制台(Virtual Console)和虚拟终端是一样的。我们只有一台终端 (物理设备) ,这是我们与计算机之间的用户接口。假如有一天,我们想拥有多个用户接口,那么,一方面我们可以增加终端数目 (物理设备) ,另一方面,还可以在同一台终端 (物理设备) 上虚拟出多个终端,它们之间互相不影响,至少看起来互相不影响。这些终端就是虚拟终端。 在Ubuntu中,我们按下Ctrl+Alt+Fx时,会进入第x个虚拟终端,一共有七个虚拟终端,其中第七个虚拟终端,就是我们默认使用的图形用户界面。 终端模拟器(Terminal Emulator) 我们知道,终端是一种物理设备,而终端模拟器(Terminal Emulator),是一个程序,这些程序用来模拟物理终端。图形用户界面中的终端模拟器一般称为终端窗口(Terminal Window),我们在Ubuntu下打开的gnome-terminal就属于此类。 tty tty 的全称是 TeleTYpewriter, 这就是早期的终端 (物理设备), 它们用于向计算机发送数据, 并将计算机的返回结果打印出来。显示器出现后, 终端不再将结果打印出来,而是显示在显示器上。但是tty的名字还是保留了下来。 在Ubuntu中,我们按下Ctrl+Alt+F1时,会进入第1个虚拟终端,你可以看到屏幕上方显示的tty1。 shell shell 和之前说的几个概念截然不同, 之前的几个概念都是与计算机的输入输出相关的, 而 shell 是和内核相关的。内核为上层的应用提供了很多服务, shell 在内核的上层, 在应用程序的下层。例如,你写了一个 hello world 程序,你并不用显式地创建一个进程来运行你的程序,你把写好的程序交给shell就行了,由shell负责为你的程序创建进程。 我们在终端模拟器中输入命令时, 终端模拟器本身并不解释执行这些命令, 它只负责输入输出, 真正解释执行这些命令的, 是 shell。 我们平时使用的sh, bash, csh 是 shell 的不同实现。 ...

2018-12-24 · 2 min · 256 words · -

linux 按关键字杀进程

linux 按关键字杀进程 kill -9 $(ps -ef | grep process0 | grep -v grep | awk '{print $2}')

2018-12-17 · 1 min · 17 words · -

按日期删除文件

按日期删除文件 # 列出30天前的日志 find /data/logs -mtime +30 -type f -name "*.*" # 删除30天前的日志 find /data/logs -mtime +30 -type f -name "*.*" -exec rm -f {} \; # 删除3天前的所有以".log"结尾的文件 find /文件路径 -name "*.log" -mtime +2 -exec rm {} \; 说明 文件路径是目标文件所在路径 -name 设定目标文件名,建议采用,否则可能误删其他文件; -ctime 文件最后一次修改时间,后面只能用整数,单位为天,同时, 还有 atime, mtime(修改时间), amin, cmin, mmin 等时间参数可选, 具体请查看帮助 -mtime: File’s data was last modified n_24 hours ago. -mtime +10: 查找10天前的文件,这里用数字代表天数,+30表示查找30天前的文件 时间说明如下图 (随手画的,大概是这个意思) ,所以删除三天前的文件要用+2 -exec 表示需要执行的命令,{} 代表 find 找到的内容, “;” 是固定写法表示结束 -exec 所以例子的"-exec rm {} ;" 就表示对find找到的符合条件的文件执行删除操作 ...

2018-10-26 · 1 min · 82 words · -

linux tools

linux tools Linux Performance Observability Tools https://hub.docker.com/r/nicolaka/netshoot https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/ldd.html ldd 作用: 用来查看程式运行所需的共享库,常用来解决程式因缺少某个库文件而不能运行的一些问题。 示例: 查看test程序运行所依赖的库: /opt/app/todeav1/test$ldd test libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000039a7e00000) libm.so.6 => /lib64/libm.so.6 (0x0000003996400000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000039a5600000) libc.so.6 => /lib64/libc.so.6 (0x0000003995800000) /lib64/ld-linux-x86-64.so.2 (0x0000003995400000)

2018-10-09 · 1 min · 33 words · -

archlinux clean

archlinux clean # pacman 缓存 目录 /var/cache/pacman/pkg # 查看缓存目录大小 du -sh /var/cache/pacman/pkg # remove cached packages that are not currently installed pacman -Sc # remove all files from the cache pacman -Scc # 定时删除 pacman 缓存 pacman -S pacman-contrib # dry run paccache -d # 软件包保留最近的两个版本 paccache -dk2 paccache -rk2 # 删除已经卸载的软件包 paccache -ruk0 # 启用 paccache timer 每周清理 systemctl enable paccache.timer pacman -Qtdq du -sh ~/.cache du -sh ~/.config du -sh ~/.local/share # clean Trash pacman -S rmlint rmlint /home/wiloon # 命令行的磁盘空间管理工具 pacman -S ncdu # 图形化的磁盘空间管理工具 pacman -S filelight https://bynss.com/linux/471439.html ...

2018-09-03 · 1 min · 122 words · -

输出重定向 Linux Shell 1>/dev/null 2>&1

输出重定向 Linux Shell 1>/dev/null 2>&1 https://blog.csdn.net/sunboy_2050/article/details/9288353 shell中可能经常能看到: echo log > /dev/null 2>&1 命令的结果可以通过 “>” 的形式来定义输出 /dev/null 代表空设备文件 > > : 代表重定向到哪里,例如: echo "123" > /home/123.txt 1 : 表示 stdout 标准输出, 系统默认值是1, 所以 >/dev/null 等同于 1>/dev/null 2 : 表示 stderr 标准错误 & : 表示等同于的意思, 2>&1, 表示 2 的输出重定向等同于 1 1 > /dev/null 2>&1 语句含义: 1 > /dev/null : 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。 2>&1 : 接着,标准错误输出重定向 (等同于) 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。 实例解析: cmd >a 2>a 和 cmd >a 2>&1 为什么不同? ...

2018-08-31 · 2 min · 263 words · -

epoll, kqueue

epoll, kqueue epoll 通过使用红黑树(RB-tree)搜索被监视的文件描述符(file descriptor)。 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间 (虚拟存储空间) 为4G (2的32次方) 。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核 (kernel) ,保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节 (从虚拟地址0xC0000000到0xFFFFFFFF) ,供内核使用,称为内核空间,而将较低的3G字节 (从虚拟地址0x00000000到0xBFFFFFFF) ,供各个进程使用,称为用户空间。 进程切换 为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。 从一个进程的运行转到另一个进程上运行,这个过程中经过下面这些变化: 保存处理机上下文,包括程序计数器和其他寄存器。 更新PCB信息。 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。 选择另一个进程执行,并更新其PCB。 更新内存管理的数据结构。 恢复处理机上下文。 进程的阻塞 正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态。可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程 (获得CPU) ,才可能将其转为阻塞状态。当进程进入阻塞状态,是不占用CPU资源的。 缓存 I/O 缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linux 的缓存 I/O 机制中,操作系统会将 I/O 的数据缓存在文件系统的页缓存 ( page cache ) 中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。 缓存 I/O 的缺点: 数据在传输过程中需要在应用程序地址空间和内核进行多次数据拷贝操作,这些数据拷贝操作所带来的 CPU 以及内存开销是非常大的。 IO模式 刚才说了,对于一次IO访问 (以read举例) ,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说,当一个read操作发生时,它会经历两个阶段: 等待数据准备 (Waiting for the data to be ready) 将数据从内核拷贝到进程中 (Copying the data from the kernel to the process) 正式因为这两个阶段,linux系统产生了下面五种网络模式的方案。 ...

2018-08-28 · 6 min · 1237 words · -

Shell 逐行处理文本文件

Shell 逐行处理文本文件, shell 读文件 https://www.cnblogs.com/dwdxdy/archive/2012/07/25/2608816.html read命令 read命令接收标准输入,或其他文件描述符的输入,得到输入后,read命令将数据放入一个标准变量中. 用read读取文件时,每次调用read命令都会读取文件中的"一行"文本. 当文件没有可读的行时, read命令将以非零状态退出. #!/bin/bash cat data.dat | while read line; do echo "File:${line}" done while read line; do echo "File:${line}" done <data.dat 2.使用awk命令完成 awk是一种优良的文本处理工具,提供了极其强大的功能. 利用awk读取文件中的每行数据,并且可以对每行数据做一些处理,还可以单独处理每行数据里的每列数据. 1 cat data.dat | awk ‘{print $0}’ 2 cat data.dat | awk ‘for(i=2;i<NF;i++) {printf $i} printf “\n”}’ 第1行代码输出data.dat里的每行数据,第2代码输出每行中从第2列之后的数据. 如果是单纯的数据或文本文件的按行读取和显示的话,使用awk命令比较方便. 3.使用for var in file 命令完成 for var in file表示变量var在file中循环取值.取值的分隔符由$IFS确定. 复制代码 1 for line in $(cat data.dat) 2 do 3 echo “File:${line}” 4 done 6 for line in cat data.dat ...

2018-08-28 · 1 min · 94 words · -

SysRq

SysRq https://blog.csdn.net/jasonchen_gbd/article/details/79080576 SysRq是Linux提供的一个"Magic System Request Key", 它可以在系统出现故障的时候协助恢复和调试系统。只要你的虚拟终端或串口还可以接收键盘输入 (系统还能响应键盘的按键中断), SysRq 就可用, 你可以借助它来查看当时的内存、进程状态等信息,而不是直接强行拔掉电源重启系统。 SysRq能做的事情看HELP就知道了: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) show-blocked-tasks(w) dump-ftrace-buffer(z) SysRq的用法 2.1 启用SysRq 首先要确保内核打开了CONFIG_MAGIC_SYSRQ配置项,这样SysRq的底层处理才可用。 另外内核中有一个宏定义SYSRQ_DEFAULT_ENABLE,表示系统默认情况下是否启用SysRq功能键。当然,不管这个值是不是yes,你都可以通过proc文件系统来开启或关闭SysRq键: 查看当前SysRq是否被开启 (0表示关闭), archlinux 默认开启 cat /proc/sys/kernel/sysrq 开启SysRq: echo 1 > /proc/sys/kernel/sysrq 也可以使用sysctl命令: sysctl -w kernel.sysrq=1 kernel.sysrq = 1 实际上sysctl这条命令就是通过修改/proc/sys/kernel/sysrq来生效的。可以把"kernel.sysrq = 1"设置到/etc/sysctl.conf中,使SysRq在下次系统重启仍生效。 上面说0表示完全关闭SysRq,1表示使能SysRq的所有功能,还可以设置成其他数字来选择开启部分功能,可参考内核里的Documentation/sysrq.txt。 SysRq支持的所有功能列表及相应的handler见drivers/tty/sysrq.c中静态数组sysrq_key_table[]的定义,当然,也可以通过下面提到的SysRq的help信息了解到。 2.2 使用SysRq 我们可以直接通过按键的方式或者通过写/proc/sysrq-trigger的方式来触发SysRq的操作。SysRq支持的操作可参考下面的HELP输出: echo > /proc/sysrq-trigger [16037.132214] SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) show-blocked-tasks(w) dump-ftrace-buffer(z) ...

2018-08-27 · 1 min · 132 words · -

sysctl

sysctl archlinux systemd-sysctl 服务在启动时会加载 /etc/sysctl.d/*.conf, 配置内核参数 /etc/sysctl.conf 不起作用 sysctl 命令被用于在内核运行时动态地修改内核的运行参数, 可用的内核参数在目录 /proc/sys 中。它包含一些 TCP/ip 堆栈和虚拟内存系统的高级选项,用sysctl可以读取设置超过五百个系统变量。 CentOS 5 supported the placement of sysctl directives in files under /etc/sysctl.d/ . The code is within /etc/init.d/functions sysctl [options] [variable[=value] …] -a: 打印所有内核参数 -n: 打印时只打印值,不打印参数名称; -e: 忽略未知关键字错误; -N: 打印时只打印参数名称,不打印值; -w: 设置参数的值 -p: 从配置文件 "/etc/sysctl.conf" 加载内核参数设置 -A: 以表格方式打印所有内核参数变量。 查看变量 # 查看 sysctl net.ipv4.ip_forward cat /proc/sys/net/ipv4/ip_forward # 查看变量, 打印所有参数并过滤 sysctl -a | grep tcp_syn_retrie sudo sysctl -a | egrep "rmem|wmem|adv_win|moderate" 设置内核参数 临时设置 重启之后会恢复为默认值。 ...

2018-08-24 · 7 min · 1458 words · -

date command

date command 输出指定时区的时间 shell 支持在 date 命令前,指定 TZ 参数,即指定时区,这样 dat e输出将会输出指定时区的时间。TZ 是 timezone 的缩写。 TZ=0 date date 打印的日期格式 默认打印12小时制的 # 默认打印 24小时制时间 vim /etc/profile.d/lctime.sh export LC_TIME=POSIX LC_TIME 选择C语言环境的时间格式类别 -d 参数支持自然语言输入,无符号默认为 + date -d "+1 day" date -d "-1 month" date [OPTION]... [+FORMAT] 日期格式化 date '+%Y-%m-%d %H:%M:%S' 纳秒,毫秒 使用 date +%s%N 可以获得一个纳秒级的unix时间戳(当前时间),然后根据需要截取一部分即可得到毫秒级的精度 # 纳秒 date +%s%N # 毫秒 $(($(date +%s%N)/1000000)) # 毫秒, 另外一种作废的不再建议使用的语法 echo $[$(date +%s%N)/1000000] 参数 %s seconds since 1970-01-01 00:00:00 UTC %N nanoseconds (000000000..999999999) # output date and time in RFC 5322 format. Example: Mon, 14 Aug 2006 02:34:56 -0600 date -R # 设置时间和日期 sudo date -s "04/12/2019 09:03:00" sudo date -s "2019-04-12 09:04:00" # 将系统日期设定成2009年11月3日的命令 date -s 11/03/2009 # 将系统时间设定成下午5点55分55秒的命令 date -s 17:55:55 http://jerrybear.blog.51cto.com/629421/393097 ...

2018-06-20 · 3 min · 552 words · -

eval command

eval command 语法: eval cmdLine eval 会对后面的 cmdLine 进行两遍扫描, 如果第一遍扫描后, cmdLine 是个普通命令, 则执行此命令;如果 cmdLine 中含有变量的间接引用, 则保证间接引用的语义。 举例如下: set 11 22 33 44 如果要输出最近一个参数,即 44, 可以使用如下命令 echo $4 但是如果我们不知道有几个参数的时候, 要输出最后一个参数, 大家可能会想到使用 $# 来输出最后一个参数 如果使用命令: echo "\$$#" 则得到的结果是 $4,而不是我们想要的44。这里涉及到一个变量间接引用的问题, 我们的本意是输出 $4, 默认情况下, 命令后忽略变量间接引用的情况。 这时候,就可以使用eval命令。 eval echo "\$$#" 得到的结果为44 eval命令将会首先扫描命令行进行所有的替换, 然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量。 eval也可以用于回显简单变量, 不一定时复杂变量。 NAME=ZONE eval echo $NAME 等价于 echo $NAME 两次扫描 test.txt内容: hello shell world! myfile=“cat test.txt” (1)echo $myfile#result:cat test.txt ...

2018-05-11 · 1 min · 95 words · -

inode

inode An inode stores all the information about a regular file, directory, or other file system object, except its data and name. 每个文件都对应一个 inode, inode 存储了除文件名和文件内容之外的所有信息。 inode (发音: eye-node) 译成中文就是索引节点, 它用来存放文件和目录的基本信息, 包含时间、档名、使用者,群组,权限, 一个文件占用一个inode,同时记录此文件的数据所在的 block 号码; http://www.ruanyifeng.com/blog/2011/12/inode.html inode是什么? inode是一个重要概念, 是理解 Unix/Linux 文件系统和硬盘储存的基础。 我觉得,理解 inode, 不仅有助于提高系统操作水平, 还有助于体会Unix设计哲学, 即如何把底层的复杂性抽象成一个简单概念, 从而大大简化用户接口。 下面就是我的inode学习笔记,尽量保持简单。 理解inode 作者: 阮一峰 inode是什么? Inode 用于存储 文件 或 目录的信息. 理解inode, 要从文件储存说起。 扇区 (Sector) 文件储存在硬盘上, 硬盘的最小存储单位叫做"扇区" (Sector) 。每个扇区储存 512 字节。(现在新的硬盘每个扇区有4K) 注意:硬盘的最小存储单位就是扇区了,而且硬盘本身并没有block的概念。 文件系统不是一个扇区一个扇区的来读数据,太慢了,所以有了block(块)的概念,它是一个块一个块的读取的,block才是文件存取的最小单位。 文件数据存储在硬盘上,硬盘的最小存储单位叫做"扇区"(512Bytes)。OS读取硬盘的时候,为了提高效率会一次性读取一个"块"(8*扇区=4K)。所以一个大文件的数据内容在磁盘上可能不是连续空间的,就需要inode来把各个Block串联起来。 ...

2018-04-05 · 2 min · 362 words · -

pidstat

pidstat pidstat是sysstat中的工具,如需使用pidstat,要先安装sysstat,在这里就不说明了。 us过高 当us值过高时,表示运行的应用消耗了大部分的cpu。在这种情况下,对于java应用而言,最重要的是找到具体消耗cpu的线程所执行的代码,可以采用如下方法。 首先通过linux命令top命令查看us过高的pid值 通过top -Hp pid查看该pid进程下的线程的cpu消耗状况,得到具体pid值 将pid值转化为16进制,这个转化后的值对应nid值的线程 通过jstack pid grep -C 20 “16进制的值” 命令查看运行程序的线程信息 该线程就是消耗cpu的线程,在采样时须多执行几次上述的过程,以确保找到真实的消耗cpu的线程。 java应用造成us过高的原因主要是线程一直处于可运行的状态Runnable,通常是这些线程在执行无阻塞、循环、正则或纯粹的计算等动作造成。 另外一个可能会造成us过高的原因是频繁的gc。如每次请求都需要分配较多内存,当访问量高时就导致不断的进行gc,系统响应速度下降, 进而造成堆积的请求更多,消耗的内存严重不足,最严重的时候会导致系统不断进行FullGC,对于频繁的gc需要通过分析jvm内存的消耗来查找原因。 pidstat 1 pidstat PID -r 3 minflt/s 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数 majflt/s 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生 VSZ Virtual Size: The virtual memory usage of entire task in kilobytes. RSS Resident Set Size: The non-swapped physical memory used by the task in kilobytes. pidstat主要用于监控全部或指定进程占用系统资源的情况,如CPU,内存、设备IO、任务切换、线程等。pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。 执行pidstat,将输出系统启动后所有活动进程的cpu统计信息: 复制代码 linux:~ # pidstat Linux 2.6.32.12-0.7-default (linux) 06/18/12 x86_64 ...

2018-03-22 · 2 min · 282 words · -