一次内存测试体验

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 位宽。 ...

一次黑苹果的安装

MacOS 一次黑苹果的安装 前提 大概四年前,在神船笔记本上安装过一次黑苹果,后来购入了 mac bookPro 2015 款,不得不说,两者的体验式天差地别。当时的黑苹果的安装是异常困难,当时用的还是 10.12,如今已经出到 10.15 了,但根据升级到 10.15 的用户体验来说,bug 挺多的,影响开发效率(显著的就是卡)。与此同时,想装个高性能的黑苹果的想法就一直在我心里盘旋。 七月份,看到了 黑果小兵的部落阁,尝试搞了个镜像,烧录,在公司的台式机安装,成了,除了核显驱动有问题(7M),可以直接用了。完全没想到如今安装黑苹果那么方便了。 配置 时间来到十月份,双十一也快到了,该买买零件了,根据经验,一套优秀的硬件可以大幅度的减少安装黑苹果的折腾时间。最后根据各方配置单,决定使用一下配置: 主板:华硕 B360M-Plus Gaming S cpu:intel i5-9400f 显卡:讯景rx580 2304sp 4G 内存:十铨火神 3000 MHz 8G * 2 pcie无线网卡:BCM94360CS2 + 外置天线 存储:主海康威视c200pro 512G + 辅intel sata ssd 120G 电源:海盗船rm550x 散热:九州风神大霜塔 机箱:先马平头哥m7 关于上面的配置,有几个点说道说道。 主板的选择是因为做工还行,有一个 PCIe 网卡槽位;cpu没什么说的,不用核显真香;显卡如果要rx580必须用 2304sp 的,现在市面上基本都是 2048sp,我是二手 500 买的,店保一年;内存其实到 2400 或者 2666 就行,这个内存 3000 的就比 2666 贵个十块钱;这个网卡真的免驱;存储推荐还是在 sata ssd 上装吧(笨,只装 nvme ssd的话都进不去安装页面);电源、散热、机箱都无所谓了,喜欢什么用什么。 安装 下载小兵的镜像 根据 macOS安装教程兼小米Pro安装过程记录 往下走,先将安装镜像拷贝好 修改 Bios 设定 advanced—Onboard Devices Configuration-Serial Port Configuration Serial Port (Off) advanced—USB Configuration-XHCI Hand-off-Enabled Secure Boot-OS Type,改成Other OS advanced—PCH configuration-IOAPIC 24-119 Entries-disabled CFG-LOCK-disabled 由于 Bios 更新,此时直接安装,会出现 apfs_module 相关的问题,通过 关于卡卡apfs_module_start及其相关问题讨论及解决办法。解决 如果以上步骤无误的话,可以进入到安装页面了,按照小兵的步骤继续走下去,分好盘 可能出现 这个"安装macOS Mojave"应用程序副本已损坏, 不能用于安装macOS. 问题,通过安装Mac OS X,提示:应用程序副本不能验证 它在下载过程中可能已遭破坏或篡改解决,拔网线,改时间 后面就没什么坑了,安装完把 u盘 的 uefi 文件夹拷贝到硬盘上就好了 结果就是,显卡免驱,网卡免驱,声卡没测试,直接通过 HDMI 连接显示器,显示器连接小音响实现发声 总结 这次大概花了三个小时就完事,比以前简单多了,主要是硬件选的好,以此文做记录。 ...

使用 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 的问题。 ...

内存文件系统使用

Linux Ubuntu 内存文件系统使用 内存的速度足够快,那么在内存中开辟一个存储空间,挂在到特定分区,实现快速缓存的方案。 tmpfs 是一种虚拟内存文件系统, 它存储在 VM(virtual memory) 里面, VM 是由 Linux 内核里面的 VM 子系统管理,现在大多数操作系统都采用了虚拟内存(MMU)管理机制。 $ mount -t tmpfs -o size= 1024m tmpfs /mnt 优点 大小随意分配 大小根据实际存储的容量而变化 不指定size大小是物理内存的一半 读写速度超级快 缺点 断电内容消失 echo "tmpfs /mnt tmpfs size=1024m 0 0\n" >> /etc/fstab 既然做出了文件系统,就来测个速度吧,fio 配置文件如下。 [global] ioengine=libaio direct=0 thread=1 norandommap=1 randrepeat=0 runtime=60 ramp_time=6 size=1g directory=/path numjobs=16 iodepth=128 [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 Jobs: 16 (f=0): [_(48),/(16)][-.-%][r=0KiB/s,w=13.0GiB/s][r=0,w=3411k IOPS][eta 01m:05s] read4k-rand: (groupid=0, jobs=16): err= 0: pid=13736: Mon Jun 8 15:25:25 2020 read: IOPS=3534k, BW=13.5GiB/s (14.5GB/s)(16.0GiB/1187msec) 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.95%, sys=84.75%, ctx=1711, majf=0, minf=2049 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=4194304,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=13752: Mon Jun 8 15:25:25 2020 read: IOPS=267k, BW=16.3GiB/s (17.5GB/s)(16.0GiB/981msec) 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=1.14%, sys=98.40%, ctx=1344, majf=0, minf=32784 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=262144,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=13768: Mon Jun 8 15:25:25 2020 write: IOPS=1572k, BW=6141MiB/s (6439MB/s)(16.0GiB/2668msec) 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=11.57%, sys=88.18%, ctx=3745, majf=0, minf=2424 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=13784: Mon Jun 8 15:25:25 2020 write: IOPS=254k, BW=15.5GiB/s (16.6GB/s)(16.0GiB/1033msec) 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.67%, sys=84.97%, ctx=1430, 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=13.5GiB/s (14.5GB/s), 13.5GiB/s-13.5GiB/s (14.5GB/s-14.5GB/s), io=16.0GiB (17.2GB), run=1187-1187msec Run status group 1 (all jobs): READ: bw=16.3GiB/s (17.5GB/s), 16.3GiB/s-16.3GiB/s (17.5GB/s-17.5GB/s), io=16.0GiB (17.2GB), run=981-981msec Run status group 2 (all jobs): WRITE: bw=6141MiB/s (6439MB/s), 6141MiB/s-6141MiB/s (6439MB/s-6439MB/s), io=16.0GiB (17.2GB), run=2668-2668msec Run status group 3 (all jobs): WRITE: bw=15.5GiB/s (16.6GB/s), 15.5GiB/s-15.5GiB/s (16.6GB/s-16.6GB/s), io=16.0GiB (17.2GB), run=1033-1033msec io带宽很高,64k 随机读的 IOPS 居然达到了惊人的 1572k。

初学C语言,几种利用嵌套循环的字母打印格式

[[C]] 初学C语言,几种利用嵌套循环的字母打印格式 1、最简单的换行嵌套,一个 for 循环控制行数,一个 for 循环控制每行输出量。 #include <stdio.h> /*输出类似于 $ $$ $$$ $$$$ $$$$$ */ int main(void) { int m,n; for(m=1;m<=5;m++) for(n=1;n<=m;n++) { printf("$"); if(n==m) printf("\n"); } } 2、相比于第一例,多了一个字符倒序输出,利用数组下标中加上变量 n 实现。 #include <stdio.h> /*输出形如 F FE FED FEDC FEDCB FEDCBA */ int main(void) { char lett[27]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int m,n; for(m=1;m<=6;m++) for(n=1;n<=m;n++) { printf("%c",lett[6-n]); if(n==m) printf("\n"); } } 3、这个的难点在于一开始不理解 ch++ 的正确使用方法,直接使用数组的方式两个循环嵌套去做,(错误)代码如下: #include <stdio.h> int main(void) { char lett[27]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int m,n; for(m=0;m<=6;m++) for(n=0;n<=m;n++) { printf("%c",lett[m+n]); if(n==m) printf("\n"); } } 先看这个的输出结果: ...