查询和清除文件系统缓存

为了减少磁盘I/O,加快读写速度,Linux内核使用文件系统的Cache,Page Cache。 下面通过一个实验验证一下,查看Cache分配使用情况。 # free -w total used free shared buffers cache available Mem: 344756 106244 186612 1540 76 51824 226956 Swap: 2097148 30464 2066684 free 从/proc/meminfo 中获取信息进行展示,这里的Page Cache主要是 cache + buffers 这两个项目项目。 page cache是针对 file systems , buffer是针对 block devices 两者是在不同时期不同场景下涉及的缓存机制,kernel2.4版本之前是分开的,并存的。之后版本进行了融合。free默认不加-w参数,可以看到输出cache和buffer合计在一起 # dd if=/dev/random of=/root/data_file count=1400000 # du data_file -sh 103M data_file 使用读取两次文件观察下执行时间 # free -w total used free shared buffers cache available Mem: 344756 106244 186612 1540 76 51824 226956 Swap: 2097148 30464 2066684 # time cat data_file > /dev/null real 0m0.273s user 0m0.000s sys 0m0.064s # free -w total used free shared buffers cache available Mem: 344756 106240 81072 1540 76 157368 227012 Swap: 2097148 30464 2066684 # time cat data_file > /dev/null real 0m0.031s user 0m0.002s sys 0m0.026s 可以看到第二次执行时间比第一次明显减少,清理一下page cache ...

2021-03-30 · 2 min · 228 words

mount操作导致磁盘数据丢失

环境: cenos7(X86_64) + openssh 问题现象: 重新编译内容,使用linux调试工具后, 终端忽然中断, 再重启机器后。启动后显示。 Failed to switch root on boot 解决思路: 通过报错查找命令解决 搜索到一下链接 Problem with CentOS: Failed to switch root on boot 。。。 mount -o remount,rw /sysroot cd /sysroot/etc echo "" >os-release mount -o remount,ro /sysroot reboot 。。。 当时也没仔细看, 直接按照里面操作执行了下。 通过安装新操作系统挂载原有磁盘: 看了下简单操作无法回复,添加了一块硬盘,下载镜像安装,调整启动磁盘顺序 [root@localhost ~]# pvdisplay --- Physical volume --- PV Name /dev/sdc2 VG Name centos00 PV Size <19.00 GiB / not usable 3.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 4863 Free PE 1 Allocated PE 4862 PV UUID 。。。 --- Physical volume --- PV Name /dev/sda3 VG Name centos PV Size 59.00 GiB / not usable 4.00 MiB Allocatable yes (but full) PE Size 4.00 MiB Total PE 15104 Free PE 0 Allocated PE 15104 PV UUID 。。。 看了之前的硬盘, 查看一下分区 ...

2021-03-02 · 2 min · 254 words

DIY esp8266 小盒子

前些天看到用esp8266开发的小盒子,按照教程https://www.instructables.com/3D-Printer-Monitor-Wemos-D1-Mini-ESP8266/操作了一下。 3D打印的外壳 作者提供了3D模型 https://www.thingiverse.com/thing:2884823, 我是使用速加网打印的, 质量和价格还不错,大概20元左右不含运费。 可能芯片规格不一样, 如果有打印机的话可以根据芯片尺寸,把盒子厚度加大一些。 相关芯片联接 主要是两个芯片: ESP8266 D1 Mini:这个普通就可以, 10元左右。 0.96 OLED : 这个建议买老款的, 新款的屏幕有些小。10元左右。 芯片链接及焊接: 焊接完成后 这里需要注意的是看好GND和5V接口,8266与OLED对接时线不要接错了, 将5V接到GND上, 烧坏了一块OLED的板子。 焊接:由于是第一次弄,大概来回焊接了3,4次,温度太高容易烧到板子, 太低焊锡又化不了。最好能固定一下, 我是拿透明胶固定了一下。 应用刷新 1 开发环境 使用Arduino IDE,配置附加的电路板的配置链接http://arduino.esp8266.com/stable/package_esp8266com_index.json , 开发版选择“WeMos D1 R2 & mini” 2 相关库选择 WiFiManager Json:arduinojson OLED:esp8266-oled-ssd1306 3 源码应用下载 https://github.com/Qrome/printer-monitor 源码及配置调整地方: Settings.h,注释掉以下几行。 //#include <WiFi.h> //#include <WiFiClient.h> //#include <WiFiServer.h> //#include <WiFiUdp.h> 配置选择了, “WeMos D1 R2 & mini”, 工具菜单中关于flash的选项。选择“Flash Size->3M (1M SPIFFS)”, 如果选择,(NO SPIFFS), 应用无法启动,会提示文件打开失败。 SPIFFS 是一个嵌入式文件系统, 由于应用中会生成配置文件, 保存相关配置信息, 配置文件生成所以该文件系统支持。 ...

2021-02-28 · 1 min · 118 words

python将多个excel合并

同一个excel文件,分配到各组填写, 最后统一汇总成一个文档反馈。 环境 windows10 python3.7 + openpyxl 目标 in目录存放各个组填写的文档 out目录存放合并后的结果文件 实现 表格 序号 产品 信息 反馈1 反馈2 01 产品1 X 00000 999999 02 产品2 X 11111 888888 03 产品3 X 22222 777777 代码: from openpyxl import load_workbook from openpyxl import Workbook import os ## 获取所有的文件 def getfilelist(dirname): li = [] for f in os.listdir(dirname): if f.endswith('.xlsx'): li.append(f) return li ## 更新 ## 1. 打开输出文件,处理一个sheet页面, ## 2. 循环获取某一行记录,放入字典结构从所有的输入文件中获取补充记录 ## 3. 如果是单条直接更新, 如果出现重复记录入职(暂不处理) ## 4. 依据以上处理方式,处理完所有sheet页面 INPATH=".\\in\\" OUTPATH=".\\out\\" productlist = ('product1','product2') ## 1. sheetname名称 ## 2. 位置1: 过滤条件 product 所在列位置,判断是否productlist ## 3. 位置2:通过判断第一个需要填写项判断是否填写数据 sheetlist = ( ('sheet1)', 6, 15), ('sheet2', 6, 13), ('sheet3', 5, 12), ('sheet4', 6, 14)) def update(): inlist = getfilelist(".\\in") outlist = getfilelist(".\\out") for li in sheetlist: sheetname = li[0] product = li[1] firstfilled= li[2] d = readdata(inlist, sheetname, product, firstfilled) writedata(outlist, d, sheetname) def readdata(inlist, sheetname, product, firstfilled): d = {} for i in inlist: wb = load_workbook(filename = INPATH+i) ws = wb[sheetname] row = tuple(ws.rows) c = filter(lambda cell: (cell[product].value in productlist) and (cell[firstfilled].value is not None), row) for cell in c: d[cell[0].row] = cell return d def writedata(outlist, d, sheetname): wbout = load_workbook(filename = OUTPATH+outlist[0]) wsout = wbout[sheetname] print(sheetname) #for key in d.keys(): for key in d: for col in range(1, wsout.max_column+1): wsout.cell(row=key, column=col).value = d[key][col-1].value wbout.save(filename = OUTPATH+outlist[0]) update() 代码调整: ...

2021-02-03 · 2 min · 237 words

python map & filter & reduce

map, filter, reduce 是函数式编程的函数, 不再需要循环分支使得代码更加简洁。map/reduce 和google的map/reduce功能是类似的, filter有些类似shuffle, 当然shuffle更多的工作是将相同的key放到同一个reduce计算中 map map(function_to_apply, list_of_inputs) 例如: items = [1,2,3,4,5] squared = [] for i in items: squared.append(i**2) print(squared) <=> 等价于 items = [1,2,3,4,5] squared = list(map(lambda x: x**2, items)) print(squared) filter filter(function_to_apply, list_of_inputs) 接着上面的代码继续 less_than_ten=[] for i in squared: if i < 10: less_than_ten.append(i) print(less_than_ten) <=> 等价于 less_than_ten=[] less_than_ten = list(filter(lambda x: x<10, squared)) print(less_than_ten) reduce reduce(function_to_apply, list_of_inputs) 和上面两个函数不同, reduce将进行迭代合并操作 product = 0 for i in less_than_ten: product = product + i print(product) <=> 等价于 from functools import reduce product = 0 product = reduce((lambda x,y:x+y), less_tan_ten) print(product) 参考及引用 https://book.pythontips.com/en/latest/map_filter.html Photo by Andy Vu from Pexels

2021-01-17 · 1 min · 102 words

docker安装 zookeeper, dubbo-admin

1 . 环境: cenos7(X86_64) + openssh 2 . 安装 配置镜像加速器, 尝试从Docker Hub下载, 速度太慢 /etc/docker/daemon.json { "max-concurrent-downloads":1, "registry-mirrors": [ "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ] } 抓取zookeeper镜像 docker pull zookeeper 抓取dubbo-admin镜像 docker pull apache/dubbo-admin 启动zookeeper容器 docker run --name zookeeper -p 2181:2181 -d zookeeper 启动duboo-admin容器 docker run -d \ -p 8081:8080 \ -e dubbo.registry.address=zookeeper://192.168.37.201:2181 \ -e dubbo.admin.root.password=root \ -e dubbo.admin.guest.password=guest \ apache/dubbo-admin 验证 浏览器输入 http://192.168.37.201:8081/ 参考及引用 http://blog.csdn.net/zxl8899/article/details/107413063 Photo by Steve Johnson from Pexels

2020-12-23 · 1 min · 68 words

docker安装tomcat

1 . 环境: cenos7(X86_64) + openssh 2 . 安装 配置镜像加速器, 尝试从Docker Hub下载, 速度太慢 /etc/docker/daemon.json { "max-concurrent-downloads":1, "registry-mirrors": [ "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ] } 抓取tomcat镜像 docker pull tomcat 启动容器 docker run -d --name tongda-user -p 8082:8080 -v /root/log/user-log:/usr/local/tomcat/user-log tomcat 验证容器 http://xxx.xxx.xxx.xxx:8082 HTTP状态 404 - 未找到 类型 状态报告 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。 Apache Tomcat/9.0.41 调整 docker exec -it mytomcat /bin/bash mv webapps webapps2 mv webapps.dist/ webapps exit 验证成功 3 . 环境变量及配置文件: Tomcat 镜像环境变量: CATALINA_BASE: /usr/local/tomcat CATALINA_HOME: /usr/local/tomcat CATALINA_TMPDIR: /usr/local/tomcat/temp JRE_HOME: /usr CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar 配置文件默认位置: ...

2020-12-22 · 1 min · 89 words

cenos7 docker安装

环境: cenos7(X86_64) + openssh 安装工具yum 安装 1 检查更新 sudo yum check-update 2 安装依赖包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 3 增加docker repo地址 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 4 安装docker sudo yum install docker 5 启动docker服务查看状态 sudo systemctl start docker 开机启动 sudo systemctl enable docker 查看状态 sudo systemctl status docker0 参考及引用 https://phoenixnap.com/kb/how-to-install-docker-centos-7 Photo by Steve Johnson from Pexels

2020-12-21 · 1 min · 57 words

spring boot+maven 生成多模块项目

spring boot + maven配置, 创建一个包含多个模块项目的步骤 项目创建 使用spring的initializr 选择一下就可以生成代码 项目: tongda (jar) 模块: user (war) order (war) common (jar) 配置: Project : Maven Project Language : Java Spring Boot : 2.4.1 Dependencies: Java : 11 Packaging :jar/war 调整 parent POM 修改tongda的pom.xml, 打包类型设置为pom 新增packaging 标签并设置为pom <packaging>pom</packaging> 通知增加模块配置 <modules> <module>user</module> <module>order</module> <module>common</module> </modules> 各个模块中调整parent标签 order, user模块 pom.xml文件 <parent> <groupId>com.tongda</groupId> <artifactId>tongda</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> 验证 > mvn clean package ... [INFO] Reactor Summary: [INFO] [INFO] tongda 0.0.1-SNAPSHOT .............................. SUCCESS [ 1.250 s] [INFO] user ............................................... SUCCESS [ 9.161 s] [INFO] order .............................................. SUCCESS [ 6.106 s] [INFO] common 0.0.1-SNAPSHOT .............................. SUCCESS [ 4.226 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ ... 参考引用 https://www.baeldung.com/maven-multi-module https://github.com/bz51/SpringBoot-Dubbo-Docker-Jenkins Photo by Zaksheuskaya from Pexels

2020-12-21 · 1 min · 116 words

用Spring boot 生成Java项目

学习java, 尝试用了spring boot创建了一个项目, 使用是maven配置, spring boot 提供很多的模板, 创建项目非常方便, 这让我想起了visual studio 点击几下鼠标自动生成模板代码。 项目创建 使用spring的initializr 选择一下就可以生成代码 我的配置: Project : Maven Project Language : Java Spring Boot : 2.4.1 Dependencies: Spring Web 创建一个web项目 Spring Boot Actuator 提供健康检查功能 Lombok: 通过注释说明生成代码需要安装相关插件 Java : 11 Packaging :jar 相关代码 : 自动生成代码如下: package com.garlicspace.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @RestController public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } 通过"/hello"文根实现页面输出"hello World!" package com.garlicspace.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @RequestMapping("/hello") public String hello(){ return "hello World!"; } } cmd运行: ...

2020-12-16 · 2 min · 322 words