vimrc文件配置

Linux VIM 【转载】vimrc文件配置的全文收录(史上最全,附带中文解释) vi 与 vim 的不同 vi 类似于 windows 的记事本,比较适合编辑普通文本,但是用于编写脚本代码就不太合适了,缺少高亮显示代码、自动缩进等重要功能;而 vim 类似于 windows 下的高级编辑器,为了提高开发效率,需要使用 vim 而不是 vi。 因此,首先做如下调整,以便只使用 vim 作为开发脚本的功能工具: [root@dabiaoge ~]# echo 'alias vi=vim' >> /etc/profile [root@dabiaoge ~]# tail -1 /etc/profile alias vi=vim [root@dabiaoge ~]# source /etc/profile 经过上述调整后,当用 vi 命令时,会自动被 vim 替代。 配置 vim 的配置文件及其重要参数介绍 全局路径:/etc/vimrc 用户个人路径:$HOME/.vimrc 建议:放在用户个人路径 $HOME/.vimrc 下。 .vimrc 文件的配置(几乎涵盖了所有) "~/.vimrc "vim config file "date 2018-12-26 "Created by bert "blog:https://blog.51cto.com/zpf666 """"""""""""""""""""""""""""""""""" """=>全局配置<=""" """"""""""""""""""""""""""""""""""" "关闭vi兼容模式" set nocompatible "设置历史记录步数" set history=1000 "开启相关插件" "侦测文件类型" filetype on "载入文件类型插件" filetype plugin on "为特定文件类型载入相关缩进文件" filetype indent on "当文件在外部被修改时,自动更新该文件" set autoread "激活鼠标的使用" set mouse=a set selection=exclusive set selectmode=mouse,key "保存全局变量" set viminfo+=! "带有如下符号的单词不要被换行分割" set iskeyword+=_,$,@,%,#,- "通过使用: commands命令,告诉我们文件的哪一行被改变过" set report=0 "被分割的窗口间显示空白,便于阅读" set fillchars=vert:\ ,stl:\ ,stlnc:\ """"""""""""""""""""""""""""""""" """=>字体和颜色<=""" """"""""""""""""""""""""""""""""" "自动开启语法高亮" syntax enable "设置字体" "set guifont=dejaVu\ Sans\ MONO\ 10 set guifont=Courier_New:h10:cANSI "设置颜色" "colorscheme desert "高亮显示当前行" set cursorline hi cursorline guibg=#00ff00 hi CursorColumn guibg=#00ff00 "高亮显示普通txt文件(需要txt.vim脚本)" au BufRead,BufNewFile * setfiletype txt """"""""""""""""""""""""""""""" """=>代码折叠功能<=""" """"""""""""""""""""""""""""""" "激活折叠功能" set foldenable "set nofen(这个是关闭折叠功能)" "设置按照语法方式折叠(可简写set fdm=XX)" "有6种折叠方法: "manual 手工定义折叠" "indent 更多的缩进表示更高级别的折叠" "expr 用表达式来定义折叠" "syntax 用语法高亮来定义折叠" "diff 对没有更改的文本进行折叠" "marker 对文中的标志进行折叠" set foldmethod=manual "set fdl=0(这个是不选用任何折叠方法)" "设置折叠区域的宽度" "如果不为0,则在屏幕左侧显示一个折叠标识列 "分别用“-”和“+”来表示打开和关闭的折叠 set foldcolumn=0 "设置折叠层数为3" setlocal foldlevel=3 "设置为自动关闭折叠" set foldclose=all "用空格键来代替zo和zc快捷键实现开关折叠" "zo O-pen a fold (打开折叠) "zc C-lose a fold (关闭折叠) "zf F-old creation (创建折叠) "nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR> """"""""""""""""""""""""""""""""""" """=>文字处理<=""" """"""""""""""""""""""""""""""""""" "使用空格来替换Tab" set expandtab "设置所有的Tab和缩进为4个空格" set tabstop=4 "设定<<和>>命令移动时的宽度为4" set shiftwidth=4 "使得按退格键时可以一次删除4个空格" set softtabstop=4 set smarttab "缩进,自动缩进(继承前一行的缩进)" "set autoindent 命令打开自动缩进,是下面配置的缩写 "可使用autoindent命令的简写,即“:set ai”和“:set noai” "还可以使用“:set ai sw=4”在一个命令中打开缩进并设置缩进级别 set ai set cindent "智能缩进" set si "自动换行” set wrap "设置软宽度" set sw=4 "行内替换" set gdefault """""""""""""""""""""""""""""""""" """=>Vim 界面<=""" """""""""""""""""""""""""""""""""" "增强模式中的命令行自动完成操作" set wildmenu "显示标尺" set ruler "设置命令行的高度" set cmdheight=1 "显示行数" set nu "不要图形按钮" set go= "在执行宏命令时,不进行显示重绘;在宏命令执行完成后,一次性重绘,以便提高性能" set lz "使回格键(backspace)正常处理indent, eol, start等" set backspace=eol,start,indent "允许空格键和光标键跨越行边界" set whichwrap+=<,>,h,l "设置魔术" set magic "关闭遇到错误时的声音提示" "关闭错误信息响铃" set noerrorbells "关闭使用可视响铃代替呼叫" set novisualbell "高亮显示匹配的括号([{和}])" set showmatch "匹配括号高亮的时间(单位是十分之一秒)" set mat=2 "光标移动到buffer的顶部和底部时保持3行距离" set scrolloff=3 "搜索逐字符高亮" set hlsearch set incsearch "搜索时不区分大小写" "还可以使用简写(“:set ic”和“:set noic”)" set ignorecase "用浅色高亮显示当前行" autocmd InsertLeave * se nocul autocmd InsertEnter * se cul "输入的命令显示出来,看的清楚" set showcmd """""""""""""""""""""""""""""""""""" """=>编码设置<=""" """""""""""""""""""""""""""""""""""" "设置编码" set encoding=utf-8 set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936 "设置文件编码" set fileencodings=utf-8 "设置终端编码" set termencoding=utf-8 "设置语言编码" set langmenu=zh_CN.UTF-8 set helplang=cn """"""""""""""""""""""""""""" """=>其他设置<=""" """"""""""""""""""""""""""""" "开启新行时使用智能自动缩进" set smartindent set cin set showmatch "在处理未保存或只读文件的时候,弹出确认" set confirm "隐藏工具栏" set guioptions-=T "隐藏菜单栏" set guioptions-=m "置空错误铃声的终端代码" set vb t_vb= "显示状态栏(默认值为1,表示无法显示状态栏)" set laststatus=2 "状态行显示的内容" set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")} "粘贴不换行问题的解决方法" set pastetoggle=<F9> "设置背景颜色" set background=dark "文件类型自动检测,代码智能补全" set completeopt=longest,preview,menu "共享剪切板" set clipboard+=unnamed "从不备份" set nobackup set noswapfile "自动保存" set autowrite "显示中文帮助" if version >= 603 set helplang=cn set encoding=utf-8 endif "设置高亮相关项" highlight Search ctermbg=black ctermfg=white guifg=white guibg=black """""""""""""""""""""""""""""""" """=>在shell脚本开头自动增加解释器以及作者等版权信息<=""" """""""""""""""""""""""""""""""" "新建.py,.cc,.sh,.java文件,自动插入文件头" autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()" "定义函数SetTitle,自动插入文件头" func SetTitle() if expand ("%:e") == 'sh' call setline(1, "#!/bin/bash") call setline(2, "#Author:bert") call setline(3, "#Blog:https://blog.51cto.com/zpf666") call setline(4, "#Time:".strftime("%F %T")) call setline(5, "#Name:".expand("%")) call setline(6, "#Version:V1.0") call setline(7, "#Description:This is a production script.") endif endfunc 转载说明 读者朋友可以直接完全复制粘贴拿去使用,只需要修改代码的开头和末尾部分的版权信息就可以使用 ...

windows7 下安装 utunbu 的几件头疼事

[[Windows 7]] [[Ubuntu]] [[Linux]] windows7 下安装 utunbu 的几件头疼事 一、系统及硬件说明 Windows版本:Windows7旗舰版 Linux版本:ubuntukylin-16.10-desktop-amd64 我的笔记本上有两块硬盘,其中一块是 1000GB 机械硬盘,分为五个区,另一块是固态 120GB,用作装系统。 大致的分区情况如下: 二、安装双系统前的准备 我的想法是,将 sda5 中的空间分出来 50G 用于安装 ubuntu,中间的什么压缩卷,转移数据就不赘述了,分好的空间就开始做 U 盘 Linux 系统盘,使用的软件是软碟通,然后等待刻录完成,开机驱动选择U盘启动,然后就开始了安装之旅,噩梦刚刚开始。 三、安装过程 一路确定下去,直到分区的时候,选择自定义分区,推荐 /boot 设置在最前面,然后是 swap 分区,/ 分区,/home 分区,具体分多少看个人喜好,然后就是等待。过了一会儿安装好了,重启。 四、设置开机引导 推荐在 Windows 下进行开机引导,我使用的是 easybcd,添加新条目的时候发现不对劲,按照网上的教程,这时候 /boot 分区前面应该有 Linux 字样,但是我这样安装之后并没有 Linux 字样,但是死马当活马医,还是把 /boot 分区作为引导项,然后重启。 重启之后,有两个登录选项,选择 linux 不能进入 ubuntu,而是进入 grub 引导,难道是我安装的时候分区错误吗,然后我重新安装了一次,仍然在 sda5 上安装了几次,但都是没出现过 Linux 字样。 五、思考 为什么我按照网上的教程多次实践也查了很多原因,看了《Linux鸟哥的私房菜》第三版里 p105 4.4.2 旧主机有两块以上硬盘多重引导该怎么办。开机流程是这样的,BIOS 启动,然后看下用户设定的第一启动盘是什么硬件,然后把权利交给该硬件(前面用U盘启动就是改了这个顺序)。我这个情况,就是给了 sdb 里的 mbr,但是之前用 easybcd 做的引导应该就是把 /boot 传输给 sdb 里的 mbr,让用户开机的时候可以选择,那么为什么进不去 Linux 呢。 ...

WTF,一款个人终端仪表板

Linux WTF,一款个人终端仪表板 主要使用方法,看下面两个链接就好了。 WTF - the terminal dashboard 开始使用 WTF 吧,一款终端仪表板 目前个人使用,还是遇到了一点坑。 坑一:配置文件 wtfutil 指令可以通过 -c/--config 指定特定的配置文件加载,但是实际在自己的机器上(macOS High Sierra)上无论怎么指定,都会指向 ~/.config/wtf/config.yml,如果将该文件删除,那么就会生成一份默认的。对此我的解决方案是,直接修改 ~/.config/wtf/config.yml,玩坏了,就重新生成默认配置。 坑二:部分模块设定 boarder:true,会导致左侧一列字符被吃掉 通过 CMDRUNNER 模块设置 istats all 会出现左侧一列字符消失,设置 boarder:false,问题解决,但缺少了 title 和边界区分 设置 DOCKER 模块,问题如上所述 由于官方目前提供的很多模块也是借助于一些接口的,例如:GitHub,GitLab,TRAVISCI 等,这些模块就没做测试,也暂时没用上。 坑三:DIGITAL CLOCK 模块显示错误 DIGITAL CLOCK 模块在我这边的显示效果,可以理解为第 3-5 个像素集体向左移动 1 像素,无论如何设置 height 和 width。 我想做的:增加一个课程表板块 我的配置 下面是我个人的配置,在 MacBook Pro 15‘ 2015 中,iTerm 完整屏幕显示效果还可以。(需要主动配置 git 仓库位置以及 markdown 文件位置)。 # 终端参数 ➜ wtf echo $COLUMNS 204 ➜ wtf echo $LINES 51 # ~/.config/wtf/config.yml wtf: colors: border: focusable: darkslateblue focused: orange normal: gray grid: columns: [40, 40, 40, 40, 40] rows: [13, 13, 13, 5, 5] refreshInterval: 1 mods: clocks: colors: rows: even: "lightblue" odd: "lightgreen" enabled: true locations: Shanghai: "Asia/Shanghai" Tokyo: "Asia/Tokyo" Toronto: "America/Toronto" New York: "America/New York" London: "Europe/London" Moscow: "Europe/Moscow" Hong Kong: "Asia/Hong Kong" Taipei: "Asia/Taipei" position: top: 0 left: 0 height: 1 width: 2 refreshInterval: 15 timeFormat: "15:04:05 -0700 MST * 2006 January 2 * Monday" dateFormat: "" sort: "chronological" title: "Clocks" type: "clocks" ipinfo: border: true colors: name: "lightblue" value: "white" enabled: true position: top: 1 left: 0 height: 1 width: 1 refreshInterval: 150 power: enabled: true position: top: 1 left: 1 height: 1 width: 1 refreshInterval: 15 title: "⚡️" nbascore: enabled: true position: top: 2 left: 2 height: 1 width: 2 refreshInterval: 600 uptime: args: [""] cmd: "uptime" enabled: true position: top: 3 left: 2 height: 1 width: 2 refreshInterval: 30 type: cmdrunner security: enabled: true position: top: 2 left: 1 height: 1 width: 1 refreshInterval: 3600 resourceusage: enabled: true position: top: 2 left: 0 height: 1 width: 1 refreshInterval: 1 todo: checkedIcon: "X" colors: checked: gray highlight: fore: "black" back: "orange" enabled: true filename: "todo.yml" position: top: 3 left: 0 height: 2 width: 1 refreshInterval: 3600 prettyweather: enabled: true city: "Hangzhou, China" position: top: 3 left: 1 height: 2 width: 1 refreshInterval: 300 unit: "m" view: 0 language: "en" git: commitCount: 5 commitFormat: "[forestgreen]%h [grey]%cd [white]%s [grey]%an[white]" dateFormat: "%H:%M %d %b %y" enabled: true position: top: 0 left: 2 height: 2 width: 3 refreshInterval: 8 repositories: - "/path/to/git/repository/1" - "/path/to/git/repository/2" textfile: enabled: true filePaths: - "/path/to/markdown/file1" - "/path/to/markdown/file2" format: true formatStyle: "dracula" position: top: 2 left: 4 height: 3 width: 1 refreshInterval: 15 wrapText: true

一次内存测试体验

Linux 一次内存测试体验 主要测试项目: 内存带宽测试 内存基准测试 内存基础知识 内存带宽计算公式 内存带宽计算公式:带宽=内存物理频率×倍增系数×(内存总线位数/8) 通用的计算公式:带宽=频率\*位宽/8 内存的物理频率 随着技术的发展,内存的物理频率以及带宽都在增加。 内存的物理频率:内存颗粒运行的物理频率,从早期的 100MHz 到现在的 260MHz。 内存的时钟周期:与内存物理频率互为倒数,所以从早期的 10ns(1/100MHz)到现在的 4n(1/266) 以内。 而内存名称上的数字则是标称频率,其实并不是物理频率。如 DDR 400、DDR2 800、DDR3 1600 和 DDR4 3200 的物理运行频率都是 200MHz,物理频率必须乘上倍增系数才能获得相应的标称频率。 标称频率是以老旧的SDRAM内存为基准,换算得出利于商业运作和产品标识的频率。 内存物理频率与标称频率的列表: 100MHz - DDR200,DDR2 400,DDR3 800,DDR4 1600 133MHz - DDR266,DDR2 533,DDR3 1067,DDR4 2133 166MHz - DDR333,DDR2 667,DDR3 1333,DDR4 2666 200MHz - DDR400,DDR2 800,DDR3 1600,DDR4 3200 233MHz - DDR3 1887,DDR4 3733, 266MHz - DDR2 1066,DDR3 2133,DDR4 4266 内存的倍增系数 内存从SDRAM发展至今DDR4,其改变如下: DDR 采用时钟脉冲上升、下降沿各传一次数据,1 个时钟信号可以传输 2 倍于 SDRAM 的数据,所以又称为双倍速率 SDRAM。一次预读 2bit 数据。它的倍增系数就是 2。 DDR2 仍然采用时钟脉冲上升、下降支各传一次数据的技术(不是传 2次),但是一次预读 4bit 数据,是 DDR 一次预读 2bit 的 2 倍,因此,它的倍增系数是 2X2=4。 DDR3 作为 DDR2 的升级版,最重要的改变是一次预读 8bit,是 DDR2 的 2 倍,所以,它的倍增系数是 2X2X2=8。 DDR4,较为复杂。DDR4 如果要继续在物理频率不增加的情况下达到高传输性能,只有两种方法。 其一就是增加预取位到 16bit 其二就是采用多总线技术。GDDR5 显存就使用了双总线技术来达到极高的内存带宽和标称频率。比如 GDDR5 5000 显存,由于采用双总线技术,我们可以将其看作两颗 “GDDR5 2500” 并行运行,每颗 “GDDR5 2500” 预取位数为 8bit,两颗组成的“双通道”,预取位数可以看作16bit。 实际上用到了第三种方法,可见DDR4 SDRAM 内存的总线位数 从 SDRAM-DDR 时代,数据总线位宽时钟没有改变,都为 64bit,但是采用双通道技术,可以获得 64X2=128bit 的位宽。如果采用四通道技术,可以达到 256bit 位宽。 ...

使用 Django 创建一份在线简历

Python [[Django]] 使用 Django 创建一份在线简历 一、开篇 去年十二月的时候,我曾跟着追梦人物的Django博客教程葫芦依样,开发出了一个自己的博客 Black&White,那时候的我对网站的结构,网站运行的模式懵懵懂懂,只会跟着教程一步步做下去,遇到问题去找解决方案的过程也很艰辛,找不到出现问题的关键点,最后成品做了出来,但因为只是模仿,没能力创新,使得最后自己的博客 url 是 demo.lightl.fun/,连二级域名都不会修改。之后几个月因为其他事缠身,也就没继续 Django 的学习。适逢将要毕业,我花了几个月将本科知识全部回顾了一遍,对计算机网络的认识更上一层楼,乘着将要找工作,不如重新实践,利用 Django 创建一份在线简历。 二、设计思路 由于做过的工程太少,很多时候设计思路只是一个方向,具体实现过程会对需求做各种变动,随机应变吧。 简单的设计思路就是,开始一个 Django 项目,开始一个新的简历应用,从网上找到前端界面模板,然后作为 static 文件放到简历应用中,根据模板可以提供的数据输出位置设计模型(数据库),然后生成数据库,存入真实数据,用 Django 提供的数据库接口获得数据,在视图函数中作为参数传给前端界面,再在前端界面中使用模板渲染的方法给传来的数据进行渲染,最后使用 nginx 部署在公网服务器上,实现在线简历功能。 三、具体实现及遇到的问题 具体实现过程中,参考自强学堂-Django 基础教程以及追梦人物的 Django 博客教程。此时的实现,会考虑每一步做的意义以及能实现的效果,同时 Django 已经升级到了 2.0.5,而网上教程多集中在 1.8,有少许区别,参照自强学堂提出的以及 google 可以解决,(同时 Django2.0.5 可以兼容Django1.8创建的项目,但在模型部分有修改)。 先是常规的建立项目,建立应用,添加应用信息到 settings.py,给 view.py 添加一个 index 方法,给 urls.py 配置 url 导向,这里没什么太多可说的。 # JL/settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'jianli', ] # JL/urls.py from django.contrib import admin from django.urls import path from jianli import views as jianli_views urlpatterns = [ path('admin/', admin.site.urls), path('', jianli_views.index, name='jianli_view'), # 新版 url 写法更舒服了 ] 之后找简历模板,最后选择了简历模板,下载,放入应用的 static 文件夹中,将 index.html 放入 templates 文件夹中,给 html 文件中指向的 css、js 位置进行修改,此时出现了第一个渲染的数据 base_dir,它指向应用的 static 文件夹,如果今后移动该文件夹,只需要修改 base_dir 内容,index.html 就可以正常工作。 ...

使用 Docker 安装 Jira Software 和 Confluence

[[Confluence]] [[Jira]] 使用 Docker 安装 Jira Software 和 Confluence Jira 是一个缺陷跟踪管理系统,为针对缺陷管理、任务追踪和项目管理的商业性应用软件,开发者是澳大利亚的 Atlassian。Jira 这个名字并不是一个缩写,而是截取自 Gojira ,日文的哥斯拉发音。 Atlassian Confluence(简称Confluence)是一个专业的 wiki 程序。它是一个知识管理的工具,通过它可以实现团队成员之间的协作和知识共享。 安装 Jira(8.1.0) 和 Confluence (7.0.1) 制作 Docker 破解镜像 atlassian-agent.jar 破解文件:atlassian-agent 目录结构: atlassian ├── docker-compose.yml ├── confluence │ ├── Dockerfile │ └── atlassian-agent.jar └── jira ├── Dockerfile └── atlassian-agent.jar atlassian/docker-compose.yml: version: "3.7" services: mysql: image: mysql:5.7 container_name: mysql ports: - "3306:3306" restart: unless-stopped networks: atlassian-net: aliases: - mysql environment: - MYSQL_ROOT_PASSWORD=123456 volumes: - type: volume source: data_mysql_vol target: /var/lib/mysql - type: volume source: conf_mysql_vol target: /etc/mysql/mysql.conf.d - type: volume source: data_backup_vol target: /backup - type: bind source: /usr/share/zoneinfo/Asia/Shanghai target: /etc/localtime read_only: true jira: image: jira/jira:v8.1.0 build: ./jira container_name: jira ports: - "8080:8080" restart: unless-stopped depends_on: - mysql networks: atlassian-net: aliases: - jira environment: - CATALINA_OPTS= -Xms1024m -Xmx2g -Datlassian.plugins.enable.wait=300 volumes: - data_jira_var:/var/atlassian/jira - data_jira_opt:/opt/atlassian/jira confluence: image: confluence/confluence:7.0.1 build: ./confluence container_name: confluence ports: - "8090:8090" restart: unless-stopped depends_on: - mysql networks: atlassian-net: aliases: - confluence volumes: - data_confluence_vol:/home/confluence_data - data_confluence_opt:/opt/atlassian/confluence - data_confluence_var:/var/atlassian/confluence networks: atlassian-net: driver: bridge volumes: data_mysql_vol: conf_mysql_vol: data_backup_vol: data_jira_var: data_jira_opt: data_confluence_vol: data_confluence_opt: data_confluence_var: atlassian/jira/Dockerfile: ...

使用 fio 测试磁盘 I/O 性能

Linux 使用 fio 测试磁盘 I/O 性能 fio 是一个常见的用于测试磁盘 I/O 性能的工具,支持 19 种不同的 I/O 引擎,包括:sync, mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。fio 一直在更新,最新的版本是 v3.19,它的官网是 fio。 fio 有两种方式对磁盘进行压力测试,一种是命令行指定参数,另外一种是读取配置文件,两者差不太多,但后者可以配合 sh,screen 等方式,保持长期的运行。 安装 $ sudo apt install fio 配置文件参数说明 配置文件属于 ini 格式的,即有区块概念,区块下通过“=”设置键值对。 filename: 指定文件 (设备) 的名称。可以通过冒号分割同时指定多个文件,如 filename=/dev/sda:/dev/sdb。 directory: 设置 filename 的路径前缀。在后面的基准测试中,采用这种方式来指定设备。 name: 指定 job 的名字,在命令行中表示新启动一个 job。 direct: bool 类型,默认为 0, 如果设置成 1,表示不使用 io buffer。 ioengine: I/O 引擎,现在 fio 支持 19 种 ioengine。默认值是 sync 同步阻塞 I/O,libaio 是 Linux 的 native 异步 I/O。关于同步异步,阻塞和非阻塞模型可以参考文章 使用异步 I/O 大大提高应用程序的性能”。 iodepth: 如果 ioengine 采用异步方式,该参数表示一批提交保持的 io 单元数。该参数可参考文章“Fio 压测工具和 io 队列深度理解和误区”。 rw: I/O 模式,随机读写,顺序读写等等。可选值:read,write,randread,randwrite,rw,randrw。 bs: I/O block 大小,默认是 4k。测试顺序读写时可以调大。 size: 指定 job 处理的文件的大小。 numjobs: 指定 job 的克隆数(线程)。 time_based: 如果在 runtime 指定的时间还没到时文件就被读写完成,将继续重复知道 runtime 时间结束。 runtime: 指定在多少秒后停止进程。如果未指定该参数,fio 将执行至指定的文件读写完全完成。 group_reporting: 当同时指定了 numjobs 了时,输出结果按组显示。 命令行使用 # 顺序读 $ fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest # 顺序写 $ fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest # 随机读 $ fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest # 随机写 $ fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest # 混合随机读写 $ fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=100 -group_reporting -name=mytest -ioscheduler=noop 配置文件启动 # fio.conf [global] ioengine=libaio iodepth=128 direct=0 thread=1 numjobs=16 norandommap=1 randrepeat=0 runtime=60 ramp_time=6 size=1g directory=/your/path [read4k-rand] stonewall group_reporting bs=4k rw=randread [read64k-seq] stonewall group_reporting bs=64k rw=read [write4k-rand] stonewall group_reporting bs=4k rw=randwrite [write64k-seq] stonewall group_reporting bs=64k rw=write $ fio fio.conf read4k-rand: (groupid=0, jobs=16): err= 0: pid=2571: Tue May 12 15:28:36 2020 read: IOPS=33.4k, BW=131MiB/s (137MB/s)(7834MiB/60002msec) slat (nsec): min=1703, max=3754.6k, avg=476047.81, stdev=421903.44 clat (usec): min=4, max=93701, avg=60830.41, stdev=9669.21 lat (usec): min=171, max=94062, avg=61307.14, stdev=9735.47 clat percentiles (usec): | 1.00th=[41681], 5.00th=[45876], 10.00th=[48497], 20.00th=[51643], | 30.00th=[54789], 40.00th=[57410], 50.00th=[60556], 60.00th=[63701], | 70.00th=[66847], 80.00th=[69731], 90.00th=[73925], 95.00th=[77071], | 99.00th=[81265], 99.50th=[82314], 99.90th=[85459], 99.95th=[86508], | 99.99th=[88605] bw ( KiB/s): min= 6240, max=11219, per=6.27%, avg=8377.40, stdev=1197.43, samples=1920 iops : min= 1560, max= 2804, avg=2094.01, stdev=299.31, samples=1920 lat (usec) : 10=0.01%, 250=0.01%, 500=0.01% lat (msec) : 2=0.01%, 4=0.01%, 10=0.01%, 20=0.02%, 50=14.27% lat (msec) : 100=85.80% cpu : usr=0.59%, sys=1.94%, ctx=1545619, majf=0, minf=0 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=107.7% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1% issued rwt: total=2003580,0,0, short=0,0,0, dropped=0,0,0 latency : target=0, window=0, percentile=100.00%, depth=128 read64k-seq: (groupid=1, jobs=16): err= 0: pid=2590: Tue May 12 15:28:36 2020 read: IOPS=10.7k, BW=674MiB/s (707MB/s)(12.3GiB/18607msec) slat (usec): min=8, max=12592, avg=1495.75, stdev=3792.74 clat (usec): min=2, max=193705, avg=189323.53, stdev=12000.95 lat (usec): min=21, max=193723, avg=190819.12, stdev=11397.67 clat percentiles (msec): | 1.00th=[ 180], 5.00th=[ 180], 10.00th=[ 182], 20.00th=[ 190], | 30.00th=[ 192], 40.00th=[ 192], 50.00th=[ 192], 60.00th=[ 192], | 70.00th=[ 192], 80.00th=[ 192], 90.00th=[ 192], 95.00th=[ 192], | 99.00th=[ 194], 99.50th=[ 194], 99.90th=[ 194], 99.95th=[ 194], | 99.99th=[ 194] bw ( KiB/s): min=41000, max=43682, per=6.12%, avg=42274.07, stdev=551.21, samples=592 iops : min= 640, max= 682, avg=660.07, stdev= 8.64, samples=592 lat (usec) : 4=0.01%, 50=0.01%, 100=0.01%, 250=0.02%, 500=0.01% lat (usec) : 750=0.01% lat (msec) : 10=0.01%, 20=0.05%, 50=0.19%, 100=0.26%, 250=100.46% cpu : usr=0.13%, sys=2.13%, ctx=49722, majf=0, minf=16 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.3%, >=64=131.4% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1% issued rwt: total=198676,0,0, short=0,0,0, dropped=0,0,0 latency : target=0, window=0, percentile=100.00%, depth=128 write4k-rand: (groupid=2, jobs=16): err= 0: pid=2607: Tue May 12 15:28:36 2020 write: IOPS=2409k, BW=9411MiB/s (9868MB/s)(16.0GiB/1741msec) clat percentiles (nsec): | 1.00th=[ 0], 5.00th=[ 0], 10.00th=[ 0], 20.00th=[ 0], | 30.00th=[ 0], 40.00th=[ 0], 50.00th=[ 0], 60.00th=[ 0], | 70.00th=[ 0], 80.00th=[ 0], 90.00th=[ 0], 95.00th=[ 0], | 99.00th=[ 0], 99.50th=[ 0], 99.90th=[ 0], 99.95th=[ 0], | 99.99th=[ 0] cpu : usr=14.12%, sys=85.68%, ctx=2337, majf=0, minf=16 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1% issued rwt: total=0,4194304,0, short=0,0,0, dropped=0,0,0 latency : target=0, window=0, percentile=100.00%, depth=128 write64k-seq: (groupid=3, jobs=16): err= 0: pid=2623: Tue May 12 15:28:36 2020 write: IOPS=221k, BW=13.5GiB/s (14.5GB/s)(16.0GiB/1188msec) clat percentiles (nsec): | 1.00th=[ 0], 5.00th=[ 0], 10.00th=[ 0], 20.00th=[ 0], | 30.00th=[ 0], 40.00th=[ 0], 50.00th=[ 0], 60.00th=[ 0], | 70.00th=[ 0], 80.00th=[ 0], 90.00th=[ 0], 95.00th=[ 0], | 99.00th=[ 0], 99.50th=[ 0], 99.90th=[ 0], 99.95th=[ 0], | 99.99th=[ 0] cpu : usr=3.63%, sys=96.11%, ctx=1862, majf=0, minf=16 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.2%, >=64=99.6% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1% issued rwt: total=0,262144,0, short=0,0,0, dropped=0,0,0 latency : target=0, window=0, percentile=100.00%, depth=128 Run status group 0 (all jobs): READ: bw=131MiB/s (137MB/s), 131MiB/s-131MiB/s (137MB/s-137MB/s), io=7834MiB (8215MB), run=60002-60002msec Run status group 1 (all jobs): READ: bw=674MiB/s (707MB/s), 674MiB/s-674MiB/s (707MB/s-707MB/s), io=12.3GiB (13.2GB), run=18607-18607msec Run status group 2 (all jobs): WRITE: bw=9411MiB/s (9868MB/s), 9411MiB/s-9411MiB/s (9868MB/s-9868MB/s), io=16.0GiB (17.2GB), run=1741-1741msec Run status group 3 (all jobs): WRITE: bw=13.5GiB/s (14.5GB/s), 13.5GiB/s-13.5GiB/s (14.5GB/s-14.5GB/s), io=16.0GiB (17.2GB), run=1188-1188msec Disk stats (read/write): nvme0n1: ios=1819561/61, merge=0/580, ticks=2577676/16, in_queue=2501764, util=96.22% 从上述结果的 bw 和 iops 来看,这是块走 pcie 3.0 * 2 的 ssd,大概率是 m.2 接口的 SSD。 ...

修复丢失的 GPG 密钥 Apt 存储库错误(NO_PUBKEY)

Linux Ubuntu 修复丢失的 GPG 密钥 Apt 存储库错误(NO_PUBKEY) apt遇到gpg error:pub key not found问题。 报错一般出现在 apt/apt-get update/upgrade 相关操作时。大致报错内容为: W: GPG error: https://packages.grafana.com/oss/deb stable InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 8C8C34C524098CB6 注意这个 8C8C34C524098CB6 这个就是 pub key。 这个问题出现的原因是:当您添加存储库,而忘记添加其公共密钥时,或者在尝试导入 GPG 密钥时可能出现临时密钥服务器错误 它造成的影响是:无法更新软件索引,从而无法更新软件 解决方案:导入公共GPG密钥 修复单个存储库的丢失 GPG 密钥问题 sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net:80 --recv-keys THE_MISSING_KEY_HERE THE_MISSING_KEY_HERE 在这里指代上面的 8C8C34C524098CB6。 完整指令是: sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net:80 --recv-keys 8C8C34C524098CB6 批量修复存储库的丢失 GPG 密钥问题 sudo apt update 2>&1 1>/dev/null | sed -ne 's/.*NO_PUBKEY //p' | while read key; do if ! [[ ${keys[*]} =~ "$key" ]]; then sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net:80 --recv-keys "$key"; keys+=("$key"); fi; done 参考 Fix Missing GPG Key Apt Repository Errors (NO_PUBKEY)

修改已有用户 uid 以及 gid

Linux 修改已有用户 uid 以及 gid 主要是为了解决 nfs 权限问题,所以一些特定的机器需要对特定的用户配置特定的uid以及gid。 配置前必须保证两点: 需要变成的id是否被占用: id $your_id 需要变动的用户是否有进程: ps -au $username 如果出现了上述两种情况,根据实际情况处理,一般的处理方法为: id被占用:删掉占用的用户,或者占用的用户重新分配id 有进程存在:ps -aux $username|grep -v PID|awk '{print $1}'|xargs kill -9 上述情况判断完成后,就需要重新指定id了。 # 假设用户tomcat的uid为90 $ id tomcat uid=90(tomcat) gid=90(tomcat) groups=90(tomcat) $ usermod -u 91 tomcat $ groupmod -g 91 tomcat $ id tomcat uid=91(tomcat) gid=91(tomcat) groups=91(tomcat) find / -user 90 -exec chown -h tomcat {} ; find / -group 90-exec chgrp -h tomcat {} ; 参考 Linux 下 NFS 服务权限问题解决 Permission denied

关于磁盘及 fs 的几个问题处理

Linux 关于磁盘及 fs 的几个问题处理 有块磁盘出现了错误,其挂载的分区可以 cd 进入,但无法通过 ls 列出当前目录文件,显示错误为: cannot list ......:Bad message 没遇到这个问题,没办法,可能与之前的 dd 操作有关? 查到的资料显示可能是 inode 损坏,那么就尝试清理 inode。 First list bad file with inode e.g. $ ls –il Output 14071947 -rw-r--r-- 1 dba 0 2010-01-27 15:49 -®Å Note: 14071947 is inode number. Now Use find command to delete file by inode: $ find . -inum 14071947 -exec rm -f {} ; It will find that bad file and will remove it with force i.e remove without prompt. 但并不奏效,因为这个目录都无法再列出文件,而不是这个问题提出者遇到的无法 rm 的问题。 ...