ETC

UNIX的/etc目录 早期系统/bin是用来存放程序(可执行二进制文件)的,然后有了/dev用来存放设备文件,和/lib用来存放库文件。/usr目录很早也有了,首先用来存放用户数据,后来也放一些用户级的/bin和/lib,man形式的用户手册也存放在此。 随着系统越来越庞大,一些无法进行归类的文件就放到了/etc目录,后来慢慢的大家将/etc目录用来存放一些系统级的配置文件,现代unix系统上,几乎所有的配置文件都在/etc目录,etc是et cetera的缩写。 I assure you that the original contents of /etc were the “et cetera” that didn’t seem to fit elsewhere. Other variants might do their own etymologies differently. Regards, Dennis Dennis: Dennis Richie 小Tips git通过ssh访问远程repo git cloe ssh://user@host:port/repo.git 编辑完 /etc/default/grub 后,用grub-mkconfig -o /boot/grub/grub.cfg更新配置。 从大到小显示目录内容 du -s * | sort -nr 创建固定大小文件 dd if=/dev/zero of=100M.test bs=100M count=1 Notepad++删除包含关键字的行 .*delete.* 强制复制所有内容 \cp -rf * target/ 将0x8.txt中的AAA替换为BBB sed -i -e 's/AAA/BBB/g' 0x8.txt 将当前目录下所有html文件内的AAA替换为BBB find ./ -name "*.html" -exec grep "AAA" {} \; -exec sed -i 's/AAA/BBB/g' {} \; 删除0x8.txt中的第3-17行内容 sed -i -e '3,17d' 0x8.txt Ubuntu安装多媒体扩展 sudo apt install ubuntu-restricted-extras Ubuntu卸载snapd sudo apt autoremove --purge snapd GIT配置代理 git config --global http.proxy socks5://127.0.0.1:20170 socks5为代理协议,可配置http/https/socks5等。 pip设置国内源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip临时使用国内源自升级 python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip SCP下载远程文件 scp -P port user@ip:/path/file ./ git卡writing objects,可以将远端地址改为ssh方式 git remote set-url origin git@gitlab.com:username/repo.git git备份归档 git archive --format=zip --output=repobak_$(date +%Y-%m-%d).zip master PowerShell激活Windows&Office irm https://get.activated.win | iex 国内可用OSM tile地址https://tile.osm.org/{z}/{x}/{y}.png 更换linux软件源 bash <(curl -sSL https://linuxmirrors.cn/main.sh) 查找当前目录下所有包含关键词的md文件 grep -r “keyword” –include="*.md" . acme.sh签署证书 #安装acme.sh,设置别名 curl https://get.acme.sh | sh -s email=my@example.com alias acme.sh=~/.acme.sh/acme.sh #根据提示添加txt解析,然后再执行--renew操作 acme.sh --issue -d 0x8.net --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please acme.sh --renew -d 0x8.net --yes-I-know-dns-manual-mode-enough-go-ahead-please

2015/6/11
articleCard.readMore

关于

饱学、无知、寡言、好色 联系 dotmd [at] outlook [dot] com 链接 Tuccuay tlanyan 搬砖日记 szhshp 的第三边境研究所 独立博客传送门 第三夏尔

2015/6/11
articleCard.readMore

洛阳两日游

三毛暑假已经过了快一月了,但一直没时间陪她出去浪,赶着这个周末两天无事,计划去趟古都洛阳。 计划了下,三个人开车自驾游划算,两个人就动车,不到一个半小时的车程,还是很方便的。 第一天 原计划周六早赶8:20到,然后怼完地道的胡辣汤,谁知道天公不作美,到达洛阳龙门站后太阳已经开始毒辣了起来,没有功夫去找胡辣汤了,约了个滴滴直接去龙门石窟景区。 到了景区后就在门口的饮食区找了家老白沙羊肉面馆,点了两份羊汤和火烧馍。洛阳的羊肉汤味道普遍清单,不想回民的羊汤调料味和胡椒味都重,我就着羊汤泡了火烧馍吃了。 三毛胃口大开,喝了第一碗又续了一碗汤(免费),看来外面的太阳没有让她的胃口打一点折。 羊汤物价 怼羊汤的三毛 怼完羊汤就去游客中心买票了,进景区时早上6、7点的游客已经开始返程了,而我们得顶着大太阳前行。 龙门入口 伊水畔的三毛 龙门石窟门口 禹王池畔的游客 禹王池的鱼很肥美,是的很肥! 陈抟老祖的十字卷碑 陈抟老祖的十字卷碑,相传宋太祖将华山地界输给了他。 门口的力士姿态很美 比耶佛 有名的比耶佛,龙门文创的No.2 优美的右侍 这个窟中最美的是这个右侍 窟中佛 从线条可以看出风格由南北朝到盛唐的转变。 衣服上的纹饰 这尊使者衣服上的纹饰很漂亮,虽然形体残破。 文创雪糕 又贡献了一支文创雪糕,上次去鹳雀楼也是的。 残破的石窟 这一窟虽然都残破,但很有看头。 万佛窟 万佛窟正中的是阿弥陀佛,我给三毛讲了净土宗的宗义,不需要研究高深的佛法,只要口称阿弥陀佛就可以去西方极乐世界,她一下就听懂了这算是速成法。 伊阙 笔法浑厚的伊阙二字,两山相对伊水中出,谓之伊阙。 密密麻麻的石窟 卢舍那大佛 有名的卢舍那大佛,龙门石窟顶流担当,No.1 伊水公园 返程时伊水上拍的 逛完龙门石窟后,原打算中午来一碗河南烩面,但真到了饭店,热的肺都快炸了,我点了份凉面没吃完,热的吃不下。 三毛胃口好,要了个土豆炖牛肉,一碗米饭,价格就不说了,以后能不在景区范围吃饭就不吃。 下午回酒店回血,开着空调睡大觉,一觉睡到六点半。完了给三毛做了古装装造,坐了4站地铁去应天门浪。 洛阳地铁 洛阳地铁每站都很远,间隔6分钟左右。 到地方正式灯光秀时刻,广场上人站满了,密不透风的那种。 看了会儿灯光秀就去路边找吃的了,延边冷面+锅贴+大份柠檬茶。 应天门夜景 吃完后再次来到应天门广场,这会儿人群已经散了,晚风也开始凉了起来,在广场东边看到一个画像摊位,摊主正在为一位少女画像,素描的,功力很好。 应天门夜景 远处的明堂 明堂那边需要门票,90一位,九点多了进去不划算就在外围转了下,然后十点多就扫了个共享电驴载着三毛回酒店了。 第二天 原打算6点起床,骑着小电驴去吃早市,谁知道6点了俩人闹钟响了都起不来,关了继续睡回笼觉,一觉醒来9点了。 早饭不吃了,打车直接去白马寺,看看中国第一刹。 白马寺山门 山门前的白马驮经 白马寺景区大门距离山门很远,我觉得时故意修的,就为了让游客坐观光车去。 弥勒菩萨 前殿的弥勒菩萨,周围是四大天王。 韦陀天像 前殿背后的元代韦陀天像雕塑。 立菩萨像 横三世佛 白马寺中还有缅甸、泰国和印度园区,里面时各国风格的佛像和建筑,看看就行,没多大意思。 逛完后1点多了,直接网上团了个大盘鸡拌面,俩人直奔市区。原计划吃完后去洛阳博物馆,谁知道已经预约不上票了,于是就在门口的商场歇会儿,吹吹空调。 洛阳博物馆 距离返程动车还有几个小时,于是就去电影院看了长安的荔枝,不得不说大鹏越来越成熟了,10分打6分吧。 总结:天热千万别处门。

2025/7/23
articleCard.readMore

LTE共享小区开通

以下为hw设备开通lte共享方法,其中小区共享开通方法一样,不同的是新旧传输模式下共享ip的配置方法不同。 4GBBU /**修改基站共享模式为运营商共载频共享模式**/ MOD ENODEBSHARINGMODE:ENODEBSHARINGMODE=SHARED_FREQ; /**重启eNodeB对应应用ID,通过LST APP:;查询**/ RST APP:AID=1; /**添加共享运营商,设置MCC和MNC**/ ADD CNOPERATOR:CNOPERATORID=1,CNOPERATORNAME="Unicom",CNOPERATORTYPE=CNOPERATOR_SECONDARY,MCC="460",MNC="01"; /**添加跟踪区域码(TAC)**/ ADD CNOPERATORTA:TRACKINGAREAID=1,CNOPERATORID=1,TAC=9993; /**添加licens共享策略**/ ADD LICENSESHARINGPOLICY:CnOperatorId=0,MaxUserNumRate=50,UserNumSharingRate=0,UserNumSharingGroupId=1; ADD LICENSESHARINGPOLICY:CnOperatorId=1,MaxUserNumRate=50,UserNumSharingRate=0,UserNumSharingGroupId=1; MOD LICRATIO:UPLICRATIO=25,TRAFFICSHARINGTYPE=DEDICATE; ADD LICRATIOSHAREPOLICY:CNOPERATORID=0,TRFRATIO=50,TRFSHARINGRATIO=20; ADD LICRATIOSHAREPOLICY:CNOPERATORID=1,TRFRATIO=50,TRFSHARINGRATIO=20; MOD GLOBALPROCSWITCH:DIFFOPWITHSAMEMMECSWITCH=OFF; MOD ENODEBALGOSWITCH:HOALGOSWITCH=InterPlmnHoSwitch-0; MOD CELLALGOSWITCH:LOCALCELLID=0,RANSHAREMODESWITCH=OFF,OPRESOURCEGROUPSHARESWITCH=OpPrbGroupshareSwitch-0; MOD CELLALGOSWITCH:LOCALCELLID=1,RANSHAREMODESWITCH=OFF,OPRESOURCEGROUPSHARESWITCH=OpPrbGroupshareSwitch-0; MOD CELLALGOSWITCH:LOCALCELLID=2,RANSHAREMODESWITCH=OFF,OPRESOURCEGROUPSHARESWITCH=OpPrbGroupshareSwitch-0; MOD CELLACCESS:LOCALCELLID=0,BROADCASTMODE=RR_MODE; MOD CELLACCESS:LOCALCELLID=1,BROADCASTMODE=RR_MODE; MOD CELLACCESS:LOCALCELLID=2,BROADCASTMODE=RR_MODE; MOD CELLOP:LOCALCELLID=0,TRACKINGAREAID=0,CELLRESERVEDFOROP=CELL_NOT_RESERVED_FOR_OP,OPULRBUSEDRATIO=50,OPDLRBUSEDRATIO=50; MOD CELLOP:LOCALCELLID=1,TRACKINGAREAID=0,CELLRESERVEDFOROP=CELL_NOT_RESERVED_FOR_OP,OPULRBUSEDRATIO=50,OPDLRBUSEDRATIO=50; MOD CELLOP:LOCALCELLID=2,TRACKINGAREAID=0,CELLRESERVEDFOROP=CELL_NOT_RESERVED_FOR_OP,OPULRBUSEDRATIO=50,OPDLRBUSEDRATIO=50; ADD CELLOP:LOCALCELLID=0,TRACKINGAREAID=1,OPULRBUSEDRATIO=50,OPDLRBUSEDRATIO=50,MMECFGNUM=CELL_MME_CFG_NUM_0; ADD CELLOP:LOCALCELLID=1,TRACKINGAREAID=1,OPULRBUSEDRATIO=50,OPDLRBUSEDRATIO=50,MMECFGNUM=CELL_MME_CFG_NUM_0; ADD CELLOP:LOCALCELLID=2,TRACKINGAREAID=1,OPULRBUSEDRATIO=50,OPDLRBUSEDRATIO=50,MMECFGNUM=CELL_MME_CFG_NUM_0; ADD DEVIP:SN=7,SBT=BASE_BOARD,PT=ETH,PN=1,IP="10.105.103.103",MASK="255.255.255.128",USERLABEL="Unicom-IP"; ADD VLANMAP: NEXTHOPIP="10.105.103.1", MASK="255.255.255.128",VLANMODE=SINGLEVLAN, VLANID=201, SETPRIO=DISABLE; ADD IPRT: RTIDX=2, SN=7, SBT=BASE_BOARD, DSTIP="10.100.0.0",DSTMASK="255.255.255.0", RTTYPE=NEXTHOP, NEXTHOP="10.105.103.1", MTUSWITCH=OFF,DESCRI="TO_UNICOM_MME",FORCEEXECUTE=YES; ADD EPGROUP: EPGROUPID=10, IPPMSWITCH=DISABLE; ADD SCTPHOST: SCTPHOSTID=10, IPVERSION=IPv4, SIGIP1V4="10.105.103.103",SIGIP1SECSWITCH=DISABLE, SIGIP2SECSWITCH=DISABLE, PN=36412, SIMPLEMODESWITCH=SIMPLE_MODE_OFF, SCTPTEMPLATEID=0, USERLABEL="Unicom_1"; ADD SCTPPEER: SCTPPEERID=200, IPVERSION=IPv4, SIGIP1V4="10.100.0.1",SIGIP1SECSWITCH=DISABLE, SIGIP2SECSWITCH=DISABLE, PN=36412,SIMPLEMODESWITCH=SIMPLE_MODE_OFF; ADD SCTPPEER: SCTPPEERID=201, IPVERSION=IPv4, SIGIP1V4="10.100.0.17",SIGIP1SECSWITCH=DISABLE, SIGIP2SECSWITCH=DISABLE, PN=36412, SIMPLEMODESWITCH=SIMPLE_MODE_OFF; ADD SCTPPEER: SCTPPEERID=202, IPVERSION=IPv4, SIGIP1V4="10.100.0.33",SIGIP1SECSWITCH=DISABLE, SIGIP2SECSWITCH=DISABLE, PN=36412, SIMPLEMODESWITCH=SIMPLE_MODE_OFF; ADD SCTPPEER: SCTPPEERID=203, IPVERSION=IPv4, SIGIP1V4="10.100.0.49", SIGIP1SECSWITCH=DISABLE, SIGIP2SECSWITCH=DISABLE, PN=36412, SIMPLEMODESWITCH=SIMPLE_MODE_OFF; ADD SCTPPEER: SCTPPEERID=204, IPVERSION=IPv4, SIGIP1V4="10.100.0.65", SIGIP1SECSWITCH=DISABLE, SIGIP2SECSWITCH=DISABLE, PN=36412, SIMPLEMODESWITCH=SIMPLE_MODE_OFF; ADD SCTPHOST2EPGRP: EPGROUPID=10, SCTPHOSTID=10; ADD SCTPPEER2EPGRP: EPGROUPID=10, SCTPPEERID=200; ADD SCTPPEER2EPGRP: EPGROUPID=10, SCTPPEERID=201; ADD SCTPPEER2EPGRP: EPGROUPID=10, SCTPPEERID=202; ADD SCTPPEER2EPGRP: EPGROUPID=10, SCTPPEERID=203; ADD SCTPPEER2EPGRP: EPGROUPID=10, SCTPPEERID=204; ADD USERPLANEHOST:UPHOSTID=10,IPVERSION=IPv4,LOCIPV4="10.105.103.103",IPSECSWITCH=DISABLE; ADD UPHOST2EPGRP:EPGROUPID=10,UPHOSTID=10; ADD S1:S1ID=1,CNOPERATORID=1,EPGROUPCFGFLAG=CP_UP_CFG,CPEPGROUPID=10,UPEPGROUPID=10,USERLABEL="Unicom_S1"; ADD EPGROUP:EPGROUPID=17,IPPMSWITCH=DISABLE,APPTYPE=NULL; ADD SCTPHOST2EPGRP: EPGROUPID=17, SCTPHOSTID=1; ADD X2:X2ID=1,CNOPERATORID=1,EPGROUPCFGFLAG=CP_UP_CFG,CPEPGROUPID=17,UPEPGROUPID=16,USERLABEL="Unicom_X2"; RST APP: AID=1; lampsite站型,lte共享License按hub数算。 5GBBU DSP APP:; LST IPADDR4:; LST INTERFACE:; LST CNOPERATORTA:; LST CELL:; DSP LICINFO:; MOD ENODEBSHARINGMODE:ENODEBSHARINGMODE=SHARED_FREQ; RST APP:AID=2; ADD CNOPERATOR:CNOPERATORID=1,CNOPERATORNAME="Unicom",CNOPERATORTYPE=CNOPERATOR_SECONDARY,MCC="460",MNC="01"; ADD CNOPERATORTA:TRACKINGAREAID=1,CNOPERATORID=1,TAC=10055; ADD LICENSESHARINGPOLICY:CnOperatorId=0,MaxUserNumRate=50,UserNumSharingRate=0,UserNumSharingGroupId=1; ADD LICENSESHARINGPOLICY:CnOperatorId=1,MaxUserNumRate=50,UserNumSharingRate=0,UserNumSharingGroupId=1; MOD LICRATIO:UPLICRATIO=25,TRAFFICSHARINGTYPE=DEDICATE; ADD LICRATIOSHAREPOLICY:CNOPERATORID=0,TRFRATIO=50,TRFSHARINGRATIO=20; ADD LICRATIOSHAREPOLICY:CNOPERATORID=1,TRFRATIO=50,TRFSHARINGRATIO=20; MOD GLOBALPROCSWITCH:DIFFOPWITHSAMEMMECSWITCH=OFF; MOD ENODEBALGOSWITCH:HOALGOSWITCH=InterPlmnHoSwitch-0; ADD INTERFACE:ITFID=2,ITFTYPE=VLAN,PT=ETH,PORTID=0,VLANID=201,IPV6SW=DISABLE; ADD IPADDR4:ITFID=2,IP="10.105.103.103",MASK="255.255.255.128",USERLABEL="Unicom_IP"; ADD SRCIPROUTE4:SRCRTIDX=1,SRCIP="10.105.103.103",RTTYPE=NEXTHOP,NEXTHOP="10.105.103.1"; ADD SCTPHOST:SCTPHOSTID=2,IPVERSION=IPv4,SIGIP1V4="10.105.103.103",SIGIP1SECSWITCH=DISABLE,SIGIP2SECSWITCH=DISABLE,PN=36412,SIMPLEMODESWITCH=SIMPLE_MODE_OFF,SCTPTEMPLATEID=0,DTLSPOLICYID=NULL,USERLABEL="Unicom_S1"; ADD SCTPHOST:SCTPHOSTID=3,IPVERSION=IPv4,SIGIP1V4="10.105.103.103",SIGIP1SECSWITCH=DISABLE,SIGIP2SECSWITCH=DISABLE,PN=36422,SIMPLEMODESWITCH=SIMPLE_MODE_OFF,SCTPTEMPLATEID=0,DTLSPOLICYID=NULL,USERLABEL="Unicom_X2"; ADD SCTPPEER:SCTPPEERID=5,IPVERSION=IPv4,SIGIP1V4="10.100.0.1",SIGIP1SECSWITCH=DISABLE,SIGIP2SECSWITCH=DISABLE,PN=36412,SIMPLEMODESWITCH=SIMPLE_MODE_OFF; ADD SCTPPEER:SCTPPEERID=6,IPVERSION=IPv4,SIGIP1V4="10.100.0.17",SIGIP1SECSWITCH=DISABLE,SIGIP2SECSWITCH=DISABLE,PN=36412,SIMPLEMODESWITCH=SIMPLE_MODE_OFF; ADD SCTPPEER:SCTPPEERID=7,IPVERSION=IPv4,SIGIP1V4="10.100.0.33",SIGIP1SECSWITCH=DISABLE,SIGIP2SECSWITCH=DISABLE,PN=36412,SIMPLEMODESWITCH=SIMPLE_MODE_OFF; ADD SCTPPEER:SCTPPEERID=8,IPVERSION=IPv4,SIGIP1V4="10.100.0.49",SIGIP1SECSWITCH=DISABLE,SIGIP2SECSWITCH=DISABLE,PN=36412,SIMPLEMODESWITCH=SIMPLE_MODE_OFF; ADD SCTPPEER:SCTPPEERID=9,IPVERSION=IPv4,SIGIP1V4="10.100.0.65",SIGIP1SECSWITCH=DISABLE,SIGIP2SECSWITCH=DISABLE,PN=36412,SIMPLEMODESWITCH=SIMPLE_MODE_OFF; ADD USERPLANEHOST:UPHOSTID=2,IPVERSION=IPv4,LOCIPV4="10.105.103.103",IPSECSWITCH=DISABLE,USERLABEL="Unicom_S1X2"; ADD EPGROUP:EPGROUPID=2,USERLABEL="Unicom_S1",IPPMSWITCH=DISABLE,APPTYPE=NULL; /** EPGROUPID 146line SCTPHOSTID 138line UPHOSTID 146line**/ ADD SCTPHOST2EPGRP:EPGROUPID=2,SCTPHOSTID=2; ADD UPHOST2EPGRP:EPGROUPID=2,UPHOSTID=2; /** ADD 140~144 SCTPPEERID TO THE EPGROUPID IN LINE 146 **/ ADD SCTPPEER2EPGRP:EPGROUPID=2,SCTPPEERID=5; ADD SCTPPEER2EPGRP:EPGROUPID=2,SCTPPEERID=6; ADD SCTPPEER2EPGRP:EPGROUPID=2,SCTPPEERID=7; ADD SCTPPEER2EPGRP:EPGROUPID=2,SCTPPEERID=8; ADD SCTPPEER2EPGRP:EPGROUPID=2,SCTPPEERID=9; ADD EPGROUP:EPGROUPID=3,USERLABEL="Unicom_X2",IPPMSWITCH=DISABLE,APPTYPE=NULL; /** EPGROUPID在34行 SCTPHOSTID在17行 UPHOSTID同23行S1X2 **/ ADD SCTPHOST2EPGRP:EPGROUPID=3,SCTPHOSTID=3; ADD UPHOST2EPGRP:EPGROUPID=3,UPHOSTID=2; /** 24行的EPGROUPID **/ ADD S1:S1ID=1,CNOPERATORID=1,EPGROUPCFGFLAG=CP_UP_CFG,CPEPGROUPID=2,UPEPGROUPID=2,USERLABEL="TO_Unicom_S1"; /** 34行的EPGROUPID **/ ADD X2:X2ID=1,CNOPERATORID=1,EPGROUPCFGFLAG=CP_UP_CFG,CPEPGROUPID=3,UPEPGROUPID=3,USERLABEL="TO_Unicom_X2"; MOD CELLALGOSWITCH:LOCALCELLID=0,RANSHAREMODESWITCH=OFF,OPRESOURCEGROUPSHARESWITCH=OpPrbGroupshareSwitch-0; MOD CELLALGOSWITCH:LOCALCELLID=1,RANSHAREMODESWITCH=OFF,OPRESOURCEGROUPSHARESWITCH=OpPrbGroupshareSwitch-0; MOD CELLALGOSWITCH:LOCALCELLID=2,RANSHAREMODESWITCH=OFF,OPRESOURCEGROUPSHARESWITCH=OpPrbGroupshareSwitch-0; MOD CELLACCESS:LOCALCELLID=0,BROADCASTMODE=RR_MODE; MOD CELLACCESS:LOCALCELLID=1,BROADCASTMODE=RR_MODE; MOD CELLACCESS:LOCALCELLID=2,BROADCASTMODE=RR_MODE; MOD CELLOP:LOCALCELLID=0,TRACKINGAREAID=0,CELLRESERVEDFOROP=CELL_NOT_RESERVED_FOR_OP,OPULRBUSEDRATIO=50,OPDLRBUSEDRATIO=50; MOD CELLOP:LOCALCELLID=1,TRACKINGAREAID=0,CELLRESERVEDFOROP=CELL_NOT_RESERVED_FOR_OP,OPULRBUSEDRATIO=50,OPDLRBUSEDRATIO=50; MOD CELLOP:LOCALCELLID=2,TRACKINGAREAID=0,CELLRESERVEDFOROP=CELL_NOT_RESERVED_FOR_OP,OPULRBUSEDRATIO=50,OPDLRBUSEDRATIO=50; ADD CELLOP:LOCALCELLID=0,TRACKINGAREAID=1,OPULRBUSEDRATIO=50,OPDLRBUSEDRATIO=50,MMECFGNUM=CELL_MME_CFG_NUM_0; ADD CELLOP:LOCALCELLID=1,TRACKINGAREAID=1,OPULRBUSEDRATIO=50,OPDLRBUSEDRATIO=50,MMECFGNUM=CELL_MME_CFG_NUM_0; ADD CELLOP:LOCALCELLID=2,TRACKINGAREAID=1,OPULRBUSEDRATIO=50,OPDLRBUSEDRATIO=50,MMECFGNUM=CELL_MME_CFG_NUM_0; RST APP:AID=2;

2025/7/21
articleCard.readMore

常用的Linux性能检测工具

下图是一些常用的Linux性能检测工具,通过这些工具我们可以对系统进行详细的检测。 Linux性能检测工具 ps ps命令用于查看当前系统中的进程状态。这个命令可以提供关于系统中运行的进程的详细信息,类似于Windows操作系统中的任务管理器。 ps命令的基本用法 以下是一些常用的参数及其用法: ps -ef:显示所有进程的信息,包括进程ID、用户ID、父进程ID、CPU使用率、启动时间、终端类型和执行的命令行。 bbq@vmd ~> ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 10:34 ? 00:00:00 /sbin/init root 2 0 0 10:34 ? 00:00:00 [kthreadd] root 3 2 0 10:34 ? 00:00:00 [rcu_gp] root 4 2 0 10:34 ? 00:00:00 [rcu_par_gp] root 5 2 0 10:34 ? 00:00:00 [slub_flushwq] root 6 2 0 10:34 ? 00:00:00 [netns] root 10 2 0 10:34 ? 00:00:00 [mm_percpu_wq] root 11 2 0 10:34 ? 00:00:00 [rcu_tasks_kthread] root 12 2 0 10:34 ? 00:00:00 [rcu_tasks_rude_kthread] root 13 2 0 10:34 ? 00:00:00 [rcu_tasks_trace_kthread] root 14 2 0 10:34 ? 00:00:00 [ksoftirqd/0] root 15 2 0 10:34 ? 00:00:00 [rcu_preempt] root 16 2 0 10:34 ? 00:00:00 [migration/0] root 18 2 0 10:34 ? 00:00:00 [cpuhp/0] root 20 2 0 10:34 ? 00:00:00 [kdevtmpfs] root 21 2 0 10:34 ? 00:00:00 [inet_frag_wq] root 22 2 0 10:34 ? 00:00:00 [kauditd] root 23 2 0 10:34 ? 00:00:00 [khungtaskd] root 24 2 0 10:34 ? 00:00:00 [oom_reaper] root 27 2 0 10:34 ? 00:00:00 [writeback] root 28 2 0 10:34 ? 00:00:00 [kcompactd0] root 29 2 0 10:34 ? 00:00:00 [ksmd] root 30 2 0 10:34 ? 00:00:00 [khugepaged] root 31 2 0 10:34 ? 00:00:00 [kintegrityd] root 32 2 0 10:34 ? 00:00:00 [kblockd] root 33 2 0 10:34 ? 00:00:00 [blkcg_punt_bio] root 34 2 0 10:34 ? 00:00:00 [tpm_dev_wq] root 35 2 0 10:34 ? 00:00:00 [edac-poller] root 36 2 0 10:34 ? 00:00:00 [devfreq_wq] root 37 2 0 10:34 ? 00:00:00 [kworker/0:1H-kblockd] root 38 2 0 10:34 ? 00:00:00 [kswapd0] root 44 2 0 10:34 ? 00:00:00 [kthrotld] root 46 2 0 10:34 ? 00:00:00 [acpi_thermal_pm] root 48 2 0 10:34 ? 00:00:00 [mld] root 49 2 0 10:34 ? 00:00:00 [ipv6_addrconf] root 54 2 0 10:34 ? 00:00:00 [kstrp] root 59 2 0 10:34 ? 00:00:00 [zswap-shrink] root 60 2 0 10:34 ? 00:00:00 [kworker/u3:0] root 119 2 0 10:34 ? 00:00:00 [hv_vmbus_con] root 120 2 0 10:34 ? 00:00:00 [hv_vmbus_rescin] root 121 2 0 10:34 ? 00:00:00 [hv_pri_chan] root 122 2 0 10:34 ? 00:00:00 [hv_sub_chan] root 124 2 0 10:34 ? 00:00:00 [ata_sff] root 125 2 0 10:34 ? 00:00:00 [scsi_eh_0] root 126 2 0 10:34 ? 00:00:00 [scsi_eh_1] root 127 2 0 10:34 ? 00:00:00 [scsi_eh_2] root 128 2 0 10:34 ? 00:00:00 [scsi_tmf_1] root 129 2 0 10:34 ? 00:00:00 [scsi_tmf_0] root 130 2 0 10:34 ? 00:00:00 [scsi_tmf_2] root 131 2 0 10:34 ? 00:00:00 [scsi_eh_3] root 132 2 0 10:34 ? 00:00:00 [scsi_tmf_3] root 140 2 0 10:34 ? 00:00:00 [kworker/0:2H-kblockd] root 172 2 0 10:34 ? 00:00:00 [jbd2/sda1-8] root 173 2 0 10:34 ? 00:00:00 [ext4-rsv-conver] root 214 1 0 10:34 ? 00:00:00 /lib/systemd/systemd-journald root 241 1 0 10:34 ? 00:00:00 /lib/systemd/systemd-udevd root 284 2 0 10:34 ? 00:00:00 [hv_balloon] root 285 2 0 10:34 ? 00:00:00 [kworker/u2:6-flush-8:0] root 304 2 0 10:34 ? 00:00:00 [cryptd] root 310 1 0 10:34 ? 00:00:00 /usr/sbin/hv_kvp_daemon -n root 394 1 0 10:34 ? 00:00:00 dhclient -4 -v -i -pf /run/dhclient.eth0.pid -lf / systemd+ 462 1 0 10:34 ? 00:00:00 /lib/systemd/systemd-timesyncd root 465 1 0 10:34 ? 00:00:00 /usr/sbin/cron -f message+ 466 1 0 10:34 ? 00:00:00 /usr/bin/dbus-daemon --system --address=systemd: - root 468 1 0 10:34 ? 00:00:00 /usr/sbin/hv_vss_daemon -n root 470 1 0 10:34 ? 00:00:00 /lib/systemd/systemd-logind root 472 1 0 10:34 ? 00:00:04 /usr/sbin/tailscaled --state=/var/lib/tailscale/ta root 474 1 0 10:34 tty1 00:00:00 /bin/login -p -- root 478 1 0 10:34 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 sta bbq 587 1 0 10:35 ? 00:00:00 /lib/systemd/systemd --user bbq 588 587 0 10:35 ? 00:00:00 (sd-pam) bbq 594 474 0 10:35 tty1 00:00:00 -fish root 637 478 0 10:35 ? 00:00:00 sshd: bbq [priv] bbq 643 637 0 10:35 ? 00:00:00 sshd: bbq@pts/0 bbq 644 643 0 10:35 pts/0 00:00:00 -fish root 2502 2 0 11:06 ? 00:00:00 [kworker/u2:2-events_unbound] root 2540 644 0 11:08 pts/0 00:00:00 sudo ltrace -p 475 root 2541 2540 0 11:08 pts/1 00:00:00 sudo ltrace -p 475 root 2542 2541 0 11:08 pts/1 00:00:00 ltrace -p 475 root 2548 478 0 11:14 ? 00:00:00 sshd: bbq [priv] bbq 2554 2548 0 11:14 ? 00:00:00 sshd: bbq@pts/2 bbq 2555 2554 0 11:14 pts/2 00:00:00 -fish root 2641 2 0 11:16 ? 00:00:01 [kworker/0:1-events_freezable_power_] root 2698 2 0 11:26 ? 00:00:00 [kworker/0:2-events_freezable_power_] root 2744 2 0 11:31 ? 00:00:00 [kworker/0:0-events] bbq 2783 2555 0 11:33 pts/2 00:00:00 ps -ef ps aux:显示所有进程的详细状态,包括进程的拥有者、进程ID、CPU和内存使用率、虚拟内存大小、常驻集大小、终端类型、进程状态、进程启动时间、执行的时间和所执行的指令。 bbq@vmd ~> ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 1.7 102464 8144 ? Ss 10:34 0:00 /sbin/init root 2 0.0 0.0 0 0 ? S 10:34 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? I< 10:34 0:00 [rcu_gp] root 4 0.0 0.0 0 0 ? I< 10:34 0:00 [rcu_par_gp] root 5 0.0 0.0 0 0 ? I< 10:34 0:00 [slub_flushwq] root 6 0.0 0.0 0 0 ? I< 10:34 0:00 [netns] root 10 0.0 0.0 0 0 ? I< 10:34 0:00 [mm_percpu_wq] root 11 0.0 0.0 0 0 ? I 10:34 0:00 [rcu_tasks_kthread] root 12 0.0 0.0 0 0 ? I 10:34 0:00 [rcu_tasks_rude_kthread] root 13 0.0 0.0 0 0 ? I 10:34 0:00 [rcu_tasks_trace_kthread] root 14 0.0 0.0 0 0 ? S 10:34 0:00 [ksoftirqd/0] root 15 0.0 0.0 0 0 ? I 10:34 0:00 [rcu_preempt] root 16 0.0 0.0 0 0 ? S 10:34 0:00 [migration/0] root 18 0.0 0.0 0 0 ? S 10:34 0:00 [cpuhp/0] root 20 0.0 0.0 0 0 ? S 10:34 0:00 [kdevtmpfs] root 21 0.0 0.0 0 0 ? I< 10:34 0:00 [inet_frag_wq] root 22 0.0 0.0 0 0 ? S 10:34 0:00 [kauditd] root 23 0.0 0.0 0 0 ? S 10:34 0:00 [khungtaskd] root 24 0.0 0.0 0 0 ? S 10:34 0:00 [oom_reaper] root 27 0.0 0.0 0 0 ? I< 10:34 0:00 [writeback] root 28 0.0 0.0 0 0 ? S 10:34 0:00 [kcompactd0] root 29 0.0 0.0 0 0 ? SN 10:34 0:00 [ksmd] root 30 0.0 0.0 0 0 ? SN 10:34 0:00 [khugepaged] root 31 0.0 0.0 0 0 ? I< 10:34 0:00 [kintegrityd] root 32 0.0 0.0 0 0 ? I< 10:34 0:00 [kblockd] root 33 0.0 0.0 0 0 ? I< 10:34 0:00 [blkcg_punt_bio] root 34 0.0 0.0 0 0 ? I< 10:34 0:00 [tpm_dev_wq] root 35 0.0 0.0 0 0 ? I< 10:34 0:00 [edac-poller] root 36 0.0 0.0 0 0 ? I< 10:34 0:00 [devfreq_wq] root 37 0.0 0.0 0 0 ? I< 10:34 0:00 [kworker/0:1H-kblockd] root 38 0.0 0.0 0 0 ? S 10:34 0:00 [kswapd0] root 44 0.0 0.0 0 0 ? I< 10:34 0:00 [kthrotld] root 46 0.0 0.0 0 0 ? I< 10:34 0:00 [acpi_thermal_pm] root 48 0.0 0.0 0 0 ? I< 10:34 0:00 [mld] root 49 0.0 0.0 0 0 ? I< 10:34 0:00 [ipv6_addrconf] root 54 0.0 0.0 0 0 ? I< 10:34 0:00 [kstrp] root 59 0.0 0.0 0 0 ? I< 10:34 0:00 [zswap-shrink] root 60 0.0 0.0 0 0 ? I< 10:34 0:00 [kworker/u3:0] root 119 0.0 0.0 0 0 ? I< 10:34 0:00 [hv_vmbus_con] root 120 0.0 0.0 0 0 ? I< 10:34 0:00 [hv_vmbus_rescin] root 121 0.0 0.0 0 0 ? I< 10:34 0:00 [hv_pri_chan] root 122 0.0 0.0 0 0 ? I< 10:34 0:00 [hv_sub_chan] root 124 0.0 0.0 0 0 ? I< 10:34 0:00 [ata_sff] root 125 0.0 0.0 0 0 ? S 10:34 0:00 [scsi_eh_0] root 126 0.0 0.0 0 0 ? S 10:34 0:00 [scsi_eh_1] root 127 0.0 0.0 0 0 ? S 10:34 0:00 [scsi_eh_2] root 128 0.0 0.0 0 0 ? I< 10:34 0:00 [scsi_tmf_1] root 129 0.0 0.0 0 0 ? I< 10:34 0:00 [scsi_tmf_0] root 130 0.0 0.0 0 0 ? I< 10:34 0:00 [scsi_tmf_2] root 131 0.0 0.0 0 0 ? S 10:34 0:00 [scsi_eh_3] root 132 0.0 0.0 0 0 ? I< 10:34 0:00 [scsi_tmf_3] root 140 0.0 0.0 0 0 ? I< 10:34 0:00 [kworker/0:2H-kblockd] root 172 0.0 0.0 0 0 ? S 10:34 0:00 [jbd2/sda1-8] root 173 0.0 0.0 0 0 ? I< 10:34 0:00 [ext4-rsv-conver] root 214 0.0 1.7 49480 7944 ? Ss 10:34 0:00 /lib/systemd/systemd-journald root 241 0.0 0.4 26528 2264 ? Ss 10:34 0:00 /lib/systemd/systemd-udevd root 284 0.0 0.0 0 0 ? S 10:34 0:00 [hv_balloon] root 285 0.0 0.0 0 0 ? I 10:34 0:00 [kworker/u2:6-events_unbound] root 304 0.0 0.0 0 0 ? I< 10:34 0:00 [cryptd] root 310 0.0 0.3 2984 1720 ? Ss 10:34 0:00 /usr/sbin/hv_kvp_daemon -n root 394 0.0 0.4 5872 2020 ? Ss 10:34 0:00 dhclient -4 -v -i -pf /run/dhclient systemd+ 462 0.0 0.5 90092 2636 ? Ssl 10:34 0:00 /lib/systemd/systemd-timesyncd root 465 0.0 0.5 6820 2456 ? Ss 10:34 0:00 /usr/sbin/cron -f message+ 466 0.0 0.7 9148 3344 ? Ss 10:34 0:00 /usr/bin/dbus-daemon --system --add root 468 0.0 0.1 2464 844 ? Ss 10:34 0:00 /usr/sbin/hv_vss_daemon -n root 470 0.0 0.9 17204 4320 ? Ss 10:34 0:00 /lib/systemd/systemd-logind root 472 0.1 15.5 1319768 70844 ? Ssl 10:34 0:04 /usr/sbin/tailscaled --state=/var/l root 474 0.0 0.5 6128 2392 tty1 Ss 10:34 0:00 /bin/login -p -- root 478 0.0 0.9 15440 4340 ? Ss 10:34 0:00 sshd: /usr/sbin/sshd -D [listener] bbq 587 0.0 0.9 18924 4324 ? Ss 10:35 0:00 /lib/systemd/systemd --user bbq 588 0.0 0.2 103180 972 ? S 10:35 0:00 (sd-pam) bbq 594 0.0 1.3 176756 6340 tty1 S+ 10:35 0:00 -fish root 637 0.0 0.9 17832 4260 ? Ss 10:35 0:00 sshd: bbq [priv] bbq 643 0.0 0.6 17992 2812 ? S 10:35 0:00 sshd: bbq@pts/0 bbq 644 0.0 1.9 244504 9044 pts/0 Ss 10:35 0:00 -fish root 2502 0.0 0.0 0 0 ? I 11:06 0:00 [kworker/u2:2-flush-8:0] root 2540 0.0 1.0 10284 4660 pts/0 S+ 11:08 0:00 sudo ltrace -p 475 root 2541 0.0 0.1 10284 480 pts/1 Ss 11:08 0:00 sudo ltrace -p 475 root 2542 0.0 0.5 4032 2400 pts/1 S+ 11:08 0:00 ltrace -p 475 root 2548 0.0 2.3 17832 10884 ? Ss 11:14 0:00 sshd: bbq [priv] bbq 2554 0.0 1.4 17992 6808 ? S 11:14 0:00 sshd: bbq@pts/2 bbq 2555 0.0 2.2 242556 10408 pts/2 Ssl 11:14 0:00 -fish root 2641 0.1 0.0 0 0 ? I 11:16 0:01 [kworker/0:1-ata_sff] root 2698 0.1 0.0 0 0 ? I 11:26 0:00 [kworker/0:2-events_freezable_power root 2744 0.0 0.0 0 0 ? I 11:31 0:00 [kworker/0:0-events] bbq 2797 0.0 0.9 11340 4324 pts/2 R+ 11:33 0:00 ps aux ps -A:列出系统中的所有进程。 bbq@vmd ~> ps -A PID TTY TIME CMD 1 ? 00:00:00 systemd 2 ? 00:00:00 kthreadd 3 ? 00:00:00 rcu_gp 4 ? 00:00:00 rcu_par_gp 5 ? 00:00:00 slub_flushwq 6 ? 00:00:00 netns 10 ? 00:00:00 mm_percpu_wq 11 ? 00:00:00 rcu_tasks_kthread 12 ? 00:00:00 rcu_tasks_rude_kthread 13 ? 00:00:00 rcu_tasks_trace_kthread 14 ? 00:00:00 ksoftirqd/0 15 ? 00:00:00 rcu_preempt 16 ? 00:00:00 migration/0 18 ? 00:00:00 cpuhp/0 20 ? 00:00:00 kdevtmpfs 21 ? 00:00:00 inet_frag_wq 22 ? 00:00:00 kauditd 23 ? 00:00:00 khungtaskd 24 ? 00:00:00 oom_reaper 27 ? 00:00:00 writeback 28 ? 00:00:00 kcompactd0 29 ? 00:00:00 ksmd 30 ? 00:00:00 khugepaged 31 ? 00:00:00 kintegrityd 32 ? 00:00:00 kblockd 33 ? 00:00:00 blkcg_punt_bio 34 ? 00:00:00 tpm_dev_wq 35 ? 00:00:00 edac-poller 36 ? 00:00:00 devfreq_wq 37 ? 00:00:00 kworker/0:1H-kblockd 38 ? 00:00:00 kswapd0 44 ? 00:00:00 kthrotld 46 ? 00:00:00 acpi_thermal_pm 48 ? 00:00:00 mld 49 ? 00:00:00 ipv6_addrconf 54 ? 00:00:00 kstrp 59 ? 00:00:00 zswap-shrink 60 ? 00:00:00 kworker/u3:0 119 ? 00:00:00 hv_vmbus_con 120 ? 00:00:00 hv_vmbus_rescin 121 ? 00:00:00 hv_pri_chan 122 ? 00:00:00 hv_sub_chan 124 ? 00:00:00 ata_sff 125 ? 00:00:00 scsi_eh_0 126 ? 00:00:00 scsi_eh_1 127 ? 00:00:00 scsi_eh_2 128 ? 00:00:00 scsi_tmf_1 129 ? 00:00:00 scsi_tmf_0 130 ? 00:00:00 scsi_tmf_2 131 ? 00:00:00 scsi_eh_3 132 ? 00:00:00 scsi_tmf_3 140 ? 00:00:00 kworker/0:2H-kblockd 172 ? 00:00:00 jbd2/sda1-8 173 ? 00:00:00 ext4-rsv-conver 214 ? 00:00:00 systemd-journal 241 ? 00:00:00 systemd-udevd 284 ? 00:00:00 hv_balloon 285 ? 00:00:00 kworker/u2:6-ext4-rsv-conversion 304 ? 00:00:00 cryptd 310 ? 00:00:00 hv_kvp_daemon 394 ? 00:00:00 dhclient 462 ? 00:00:00 systemd-timesyn 465 ? 00:00:00 cron 466 ? 00:00:00 dbus-daemon 468 ? 00:00:00 hv_vss_daemon 470 ? 00:00:00 systemd-logind 472 ? 00:00:05 tailscaled 474 tty1 00:00:00 login 478 ? 00:00:00 sshd 587 ? 00:00:00 systemd 588 ? 00:00:00 (sd-pam) 594 tty1 00:00:00 fish 637 ? 00:00:00 sshd 643 ? 00:00:00 sshd 644 pts/0 00:00:00 fish 2502 ? 00:00:00 kworker/u2:2-events_unbound 2540 pts/0 00:00:00 sudo 2541 pts/1 00:00:00 sudo 2542 pts/1 00:00:00 ltrace 2548 ? 00:00:00 sshd 2554 ? 00:00:00 sshd 2555 pts/2 00:00:00 fish 2641 ? 00:00:01 kworker/0:1-ata_sff 2698 ? 00:00:00 kworker/0:2-events_freezable_power_ 2744 ? 00:00:00 kworker/0:0-events 2811 pts/2 00:00:00 ps ps -a:显示所有终端下执行的程序。 bbq@vmd ~> ps -a PID TTY TIME CMD 594 tty1 00:00:00 fish 2540 pts/0 00:00:00 sudo 2542 pts/1 00:00:00 ltrace 2824 pts/2 00:00:00 ps ps命令的输出解释 ps命令的输出包含了多个列,每个列都有其特定的含义。例如: USER:进程的拥有者,通常是运行该进程的用户账户的名称。 PID:进程ID,用于唯一标识一个进程。 %CPU:进程占用的CPU使用率百分比。 %MEM:进程占用的物理内存使用率百分比。 VSZ:虚拟内存大小,单位是KB。 RSS:常驻集大小,单位是KB,表示进程在物理内存中占用的固定大小。 TTY:终端类型,如果进程没有与任何终端关联,则显示为“?”。 STAT:进程状态,描述了进程的当前状态,如运行中、休眠等。 START:进程启动的时间。 TIME:进程实际使用CPU的时间,单位是小时:分钟:秒。 COMMAND:启动进程的命令名称或命令行。 ps命令的高级用法 ps命令还支持许多高级选项,可以用来定制输出或按特定条件筛选进程。例如: ps -u <用户名>:显示指定用户的进程。 bbq@vmd ~> ps -u bbq PID TTY TIME CMD 587 ? 00:00:00 systemd 588 ? 00:00:00 (sd-pam) 594 tty1 00:00:00 fish 2554 ? 00:00:00 sshd 2555 pts/2 00:00:00 fish 2869 pts/2 00:00:00 ps ps -ef | grep <模式>:使用grep命令过滤特定模式的进程。 ps aux –sort=-%cpu:按CPU使用率降序显示进程。 ps -o pid,tty,cmd:自定义输出格式,只显示进程ID、终端类型和执行的命令行。 ps命令的注意事项 在使用ps命令时,需要注意其输出风格的不同。例如,ps aux是BSD风格,可能会截断command列,而ps -ef是System V风格,不会截断command列。这种区别在结合grep命令过滤进程时可能会影响到结果。 top top命令可以动态地持续监听进程地运行状态,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态。 top命令的基本格式如下: top [选项] top选项: -d 秒数:指定 top 命令每隔几秒更新。默认是 3 秒; -b:使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中; -n 次数:指定 top 命令执行的次数。一般和"-“选项合用; -p 进程PID:仅查看指定 ID 的进程; -s:使 top 命令在安全模式中运行,避免在交互模式中出现错误; -u 用户名:只监听某个用户的进程; 在 top 命令的显示窗口中,还可以使用如下按键,进行一下交互操作: ? 或 h:显示交互模式的帮助; P:按照 CPU 的使用率排序,默认就是此选项; M:按照内存的使用率排序; N:按照 PID 排序; T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序; k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号; r:按照 PID 给某个进程重设优先级(Nice)值; q:退出 top 命令; top command ss ss是Socket Statistics的缩写,用于显示系统中套接字的统计信息。它是netstat的高效替代工具,能够提供更详细的 TCP、UDP、UNIX 套接字信息,并且速度更快。ss 的高效性得益于其利用了 Linux 内核中的 tcp_diag 模块。 ss命令的基本语法为: ss [OPTIONS] [FILTER] 常用选项包括: -a:显示所有套接字,包括监听和非监听的。 -t:仅显示 TCP 套接字。 -u:仅显示 UDP 套接字。 -l:仅显示监听状态的套接字。 -p:显示与套接字关联的进程信息。 -n:以数字形式显示地址,不解析主机名。 -s:显示套接字的摘要信息。 -4:仅显示 IPv4 套接字。 -6:仅显示 IPv6 套接字。 -o:显示 TCP 计时器信息。 bbq@vmd ~> ss -l4 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process udp UNCONN 0 0 0.0.0.0:bootpc 0.0.0.0:* udp UNCONN 0 0 0.0.0.0:41641 0.0.0.0:* tcp LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* tcp LISTEN 0 4096 100.71.18.77:36777 0.0.0.0:* mptcp LISTEN 0 4096 100.71.18.77:36777 0.0.0.0:* ltrace Linux ltrace 是一种 Linux 应用程序调试工具,它可以跟踪应用程序的动态库调用和系统调用。Linux ltrace 工具可以在应用程序启动时启动,并记录应用程序调用的所有动态库函数和系统调用。这些记录可以帮助开发人员跟踪和分析应用程序的执行过程,识别 Bug 和性能瓶颈,并进行必要的优化和调整。 ltrace命令的基本语法: ltrace [options] [command] -c 统计每个库调用的次数和时间 -f 跟踪由fork调用产生的所有子进程 -e expr 只跟踪匹配表达式expr的库调用 -o file 把跟踪输出保存到文件file -p PID 跟踪指定进程ID的调用 -l library 只跟踪特定库的调用 -S 跟踪系统调用而非库调用 -n 忽略对某些符号的跟踪 以hello.c程序为例,代码如下: #include <stdio.h> int main () { printf("Hello world!\n"); return 0; } bbq@vmd ~> gcc hello.c -o hello #### 跟踪程序调用的库 bbq@vmd ~> ltrace ./hello puts("Hello world!"Hello world! ) = 13 +++ exited (status 0) +++ #### 库调用频率 bbq@vmd ~> ltrace -c ./hello Hello world! % time seconds usecs/call calls function ------ ----------- ----------- --------- -------------------- 100.00 0.000332 332 1 puts ------ ----------- ----------- --------- -------------------- 100.00 0.000332 1 total #### 跟踪系统调用 bbq@vmd ~> ltrace -S ./hello SYS_brk(0) = 0x563354593000 SYS_mmap(0, 8192, 3, 34) = 0x7f14293dc000 SYS_access("/etc/ld.so.preload", 04) = -2 SYS_openat(0xffffff9c, 0x7f14294070b1, 0x80000, 0) = 3 SYS_newfstatat(3, 0x7f1429407c99, 0x7fff9b46e4c0, 4096) = 0 SYS_mmap(0, 0x4c33, 1, 2) = 0x7f14293d7000 SYS_close(3) = 0 SYS_openat(0xffffff9c, 0x7f14293dc140, 0x80000, 0) = 3 SYS_read(3, "\177ELF\002\001\001\003", 832) = 832 SYS_pread(3, 0x7fff9b46e240, 784, 64) = 784 SYS_newfstatat(3, 0x7f1429407c99, 0x7fff9b46e4c0, 4096) = 0 SYS_pread(3, 0x7fff9b46e110, 784, 64) = 784 SYS_mmap(0, 0x1e0f50, 1, 2050) = 0x7f14291f6000 SYS_mmap(0x7f142921c000, 0x155000, 5, 2066) = 0x7f142921c000 SYS_mmap(0x7f1429371000, 0x53000, 1, 2066) = 0x7f1429371000 SYS_mmap(0x7f14293c4000, 0x6000, 3, 2066) = 0x7f14293c4000 SYS_mmap(0x7f14293ca000, 0xcf50, 3, 50) = 0x7f14293ca000 SYS_close(3) = 0 SYS_mmap(0, 0x3000, 3, 34) = 0x7f14291f3000 SYS_arch_prctl(4098, 0x7f14291f3740, 0, 34) = 0 SYS_set_tid_address(0x7f14291f3a10, 0x7f14291f3740, 0x7f14294120d8, 34) = 2639 SYS_set_robust_list(0x7f14291f3a20, 24, 0x7f14294120d8, 34) = 0 SYS_334(0x7f14291f4060, 32, 0, 0x53053053) = 0 SYS_mprotect(0x7f14293c4000, 16384, 1) = 0 SYS_mprotect(0x56332a96b000, 4096, 1) = 0 SYS_mprotect(0x7f142940f000, 8192, 1) = 0 SYS_prlimit64(0, 3, 0, 0x7fff9b46f000) = 0 SYS_munmap(0x7f14293d7000, 19507) = 0 puts("Hello world!" <unfinished ...> SYS_newfstatat(1, 0x7f142938bdd5, 0x7fff9b46f150, 4096) = 0 SYS_318(0x7f14293cf478, 8, 1, 4096) = 8 SYS_brk(0) = 0x563354593000 SYS_brk(0x5633545b4000) = 0x5633545b4000 SYS_write(1, "Hello world!\n", 13Hello world! ) = 13 <... puts resumed> ) = 13 SYS_exit_group(0 <no return ...> +++ exited (status 0) +++ starce strace用于跟踪进程执行时的系统调用和信号。它能详细记录进程对系统调用的使用情况,包括参数、返回值、时间消耗等。strace底层使用内核的ptrace特性来实现其功能。 strace的基本用法: strace COMMAND strace常用选项 -c:统计每个系统调用的执行时间、次数和出错次数。 -f:跟踪由 fork 调用所产生的子进程。 -o filename:将 strace 的输出写入文件 filename。 -p pid:跟踪指定的进程 pid。 -t:在输出中的每一行前加上时间信息。 -e trace=xxx:只跟踪指定的系统调用,例如 -e trace=open 只跟踪open调用。 #### 跟踪 cat /etc/passwd 命令中的 open 系统调用 bbq@vmd ~> strace -e trace=open cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin _apt:x:42:65534::/nonexistent:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin systemd-timesync:x:997:997:systemd Time Synchronization:/:/usr/sbin/nologin messagebus:x:100:107::/nonexistent:/usr/sbin/nologin sshd:x:101:65534::/run/sshd:/usr/sbin/nologin bbq:x:1000:1000:bbq,,,:/home/bbq:/usr/bin/fish +++ exited with 0 +++ #### 显示时间戳 bbq@vmd ~> strace -tt ls /usr/local/bin/ 11:47:25.394035 execve("/usr/bin/ls", ["ls", "/usr/local/bin/"], 0x7fffd07a5120 /* 20 vars */) = 0 11:47:25.394476 brk(NULL) = 0x55e38716e000 11:47:25.394664 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe1a9cfd000 11:47:25.394771 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (没有那个文件或目录) 11:47:25.395324 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 11:47:25.395692 newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=19775, ...}, AT_EMPTY_PATH) = 0 11:47:25.396001 mmap(NULL, 19775, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fe1a9cf8000 11:47:25.396271 close(3) = 0 11:47:25.396421 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3 11:47:25.396642 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832 11:47:25.396842 newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=174312, ...}, AT_EMPTY_PATH) = 0 11:47:25.397101 mmap(NULL, 186064, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe1a9cca000 11:47:25.397232 mmap(0x7fe1a9cd1000, 110592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7fe1a9cd1000 11:47:25.397417 mmap(0x7fe1a9cec000, 32768, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x7fe1a9cec000 11:47:25.397609 mmap(0x7fe1a9cf4000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x29000) = 0x7fe1a9cf4000 11:47:25.397756 mmap(0x7fe1a9cf6000, 5840, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fe1a9cf6000 11:47:25.397969 close(3) = 0 11:47:25.398128 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 11:47:25.398265 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20t\2\0\0\0\0\0"..., 832) = 832 11:47:25.398408 pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784 11:47:25.398515 newfstatat(3, "", {st_mode=S_IFREG|0755, st_size=1922136, ...}, AT_EMPTY_PATH) = 0 11:47:25.398676 pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784 11:47:25.398801 mmap(NULL, 1970000, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe1a9ae9000 11:47:25.399029 mmap(0x7fe1a9b0f000, 1396736, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x26000) = 0x7fe1a9b0f000 11:47:25.399228 mmap(0x7fe1a9c64000, 339968, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17b000) = 0x7fe1a9c64000 11:47:25.399433 mmap(0x7fe1a9cb7000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1ce000) = 0x7fe1a9cb7000 11:47:25.399618 mmap(0x7fe1a9cbd000, 53072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fe1a9cbd000 11:47:25.399989 close(3) = 0 11:47:25.400142 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpcre2-8.so.0", O_RDONLY|O_CLOEXEC) = 3 11:47:25.400307 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832 11:47:25.400447 newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=629384, ...}, AT_EMPTY_PATH) = 0 11:47:25.400645 mmap(NULL, 627592, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe1a9a4f000 11:47:25.400809 mmap(0x7fe1a9a51000, 438272, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fe1a9a51000 11:47:25.401044 mmap(0x7fe1a9abc000, 176128, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6d000) = 0x7fe1a9abc000 11:47:25.401280 mmap(0x7fe1a9ae7000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x98000) = 0x7fe1a9ae7000 11:47:25.401497 close(3) = 0 11:47:25.401672 mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe1a9a4c000 11:47:25.401916 arch_prctl(ARCH_SET_FS, 0x7fe1a9a4c800) = 0 11:47:25.402079 set_tid_address(0x7fe1a9a4cad0) = 3658 11:47:25.402248 set_robust_list(0x7fe1a9a4cae0, 24) = 0 11:47:25.402383 rseq(0x7fe1a9a4d120, 0x20, 0, 0x53053053) = 0 11:47:25.402628 mprotect(0x7fe1a9cb7000, 16384, PROT_READ) = 0 11:47:25.402768 mprotect(0x7fe1a9ae7000, 4096, PROT_READ) = 0 11:47:25.405502 mprotect(0x7fe1a9cf4000, 4096, PROT_READ) = 0 11:47:25.406162 mprotect(0x55e35156f000, 4096, PROT_READ) = 0 11:47:25.406451 mprotect(0x7fe1a9d30000, 8192, PROT_READ) = 0 11:47:25.406921 prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0 11:47:25.407141 munmap(0x7fe1a9cf8000, 19775) = 0 11:47:25.407681 statfs("/sys/fs/selinux", 0x7ffdadf6e8f0) = -1 ENOENT (没有那个文件或目录) 11:47:25.408380 statfs("/selinux", 0x7ffdadf6e8f0) = -1 ENOENT (没有那个文件或目录) 11:47:25.409183 getrandom("\x64\xe9\x3f\x61\xd7\xee\xe8\x27", 8, GRND_NONBLOCK) = 8 11:47:25.409404 brk(NULL) = 0x55e38716e000 11:47:25.409533 brk(0x55e38718f000) = 0x55e38718f000 11:47:25.409779 openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3 11:47:25.410114 newfstatat(3, "", {st_mode=S_IFREG|0444, st_size=0, ...}, AT_EMPTY_PATH) = 0 11:47:25.410296 read(3, "nodev\tsysfs\nnodev\ttmpfs\nnodev\tbd"..., 1024) = 347 11:47:25.410510 read(3, "", 1024) = 0 11:47:25.410714 close(3) = 0 11:47:25.410943 access("/etc/selinux/config", F_OK) = -1 ENOENT (没有那个文件或目录) 11:47:25.411219 openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 11:47:25.411414 newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=3264112, ...}, AT_EMPTY_PATH) = 0 11:47:25.411608 mmap(NULL, 3264112, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fe1a9600000 11:47:25.411737 close(3) = 0 11:47:25.411999 ioctl(1, TCGETS, {c_iflag=ICRNL|IXANY|IMAXBEL|IUTF8, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|OPOST|ONLCR, c_cflag=B38400|CS8|CREAD, c_lflag=ISIG|ICANON|ECHO|ECHOE|ECHOK|IEXTEN|ECHOCTL|ECHOKE, ...}) = 0 11:47:25.412189 ioctl(1, TIOCGWINSZ, {ws_row=31, ws_col=102, ws_xpixel=1326, ws_ypixel=713}) = 0 11:47:25.412388 statx(AT_FDCWD, "/usr/local/bin/", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT, STATX_MODE, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0755, stx_size=4096, ...}) = 0 11:47:25.412561 openat(AT_FDCWD, "/usr/local/bin/", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3 11:47:25.412708 newfstatat(3, "", {st_mode=S_IFDIR|0755, st_size=4096, ...}, AT_EMPTY_PATH) = 0 11:47:25.412896 getdents64(3, 0x55e387174d30 /* 3 entries */, 32768) = 72 11:47:25.413093 getdents64(3, 0x55e387174d30 /* 0 entries */, 32768) = 0 11:47:25.413285 close(3) = 0 11:47:25.413472 newfstatat(1, "", {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x2), ...}, AT_EMPTY_PATH) = 0 11:47:25.413649 write(1, "hugo\n", 5hugo ) = 5 11:47:25.413758 close(1) = 0 11:47:25.414039 close(2) = 0 11:47:25.414256 exit_group(0) = ? 11:47:25.414735 +++ exited with 0 +++ vmstat vmstat(Virtual Memory Statistics)是一个用于监控Linux系统性能的命令行工具。它可以实时显示系统的虚拟内存、进程、CPU活动等信息,帮助系统管理员了解系统的整体运行状况。 vmstat命令的基本语法为: vmstat [options] [interval] [count] options:可选参数,用于指定显示的内容。 interval:监测时间间隔(单位为秒)。 count:监测次数。 vmstat常用选项 -a:显示活动和非活动的虚拟内存。 bbq@vmd ~> vmstat -a procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b 交换 空闲 不活动 活动 si so bi bo in cs us sy id wa st 1 0 31372 81720 128780 78948 2 16 96 130 1 117 0 0 99 0 0 -d:显示每个磁盘的统计信息。 bbq@vmd ~> vmstat -d disk- ------------reads------------ ------------writes----------- -----IO------ 总用量 merged 扇区 ms 总用量 merged 扇区 ms cur sec fd0 0 0 0 0 0 0 0 0 0 0 sda 18767 7555 1291022 13296 15457 42570 1756240 55971 0 26 sr0 0 0 0 0 0 0 0 0 0 0 loop0 0 0 0 0 0 0 0 0 0 0 loop1 0 0 0 0 0 0 0 0 0 0 loop2 0 0 0 0 0 0 0 0 0 0 loop3 0 0 0 0 0 0 0 0 0 0 loop4 0 0 0 0 0 0 0 0 0 0 loop5 0 0 0 0 0 0 0 0 0 0 loop6 0 0 0 0 0 0 0 0 0 0 loop7 0 0 0 0 0 0 0 0 0 0 -m:显示内存使用情况的统计信息。 root@aly ~# vmstat -m Cache Num Total Size Pages Acpi-Operand 561 896 72 56 Acpi-State 306 306 80 51 anon_vma 1373 1443 104 39 anon_vma_chain 2283 2752 64 64 bdev_cache 40 40 1600 20 bio-128 189 189 192 21 bio-192 128 128 256 16 bio-256 36 36 320 12 biovec-128 32 32 2048 16 biovec-64 32 32 1024 16 biovec-max 82 104 4096 8 buffer_head 110038 110058 104 39 cred_jar 198 336 192 21 dax_cache 19 19 832 19 dentry 45843 45843 192 21 dmaengine-unmap-128 15 15 1088 15 dmaengine-unmap-256 15 15 2112 15 dma-kmalloc-128 0 0 128 32 dma-kmalloc-16 0 0 16 256 dma-kmalloc-192 0 0 192 21 dma-kmalloc-1k 0 0 1024 16 dma-kmalloc-256 0 0 256 16 dma-kmalloc-2k 0 0 2048 16 dma-kmalloc-32 0 0 32 128 dma-kmalloc-4k 0 0 4096 8 dma-kmalloc-512 0 0 512 16 dma-kmalloc-64 0 0 64 64 dma-kmalloc-8 0 0 8 512 Cache Num Total Size Pages dma-kmalloc-8k 0 0 8192 4 dma-kmalloc-96 0 0 96 42 dm_uevent 0 0 2888 11 dnotify_struct 0 0 32 128 dquot 144 144 256 16 ep_head 512 512 16 256 ext4_allocation_context 60 60 136 30 ext4_extent_status 9583 9588 40 102 ext4_fc_dentry_update 0 0 96 42 ext4_groupinfo_4k 418 418 184 22 ext4_inode_cache 15093 15093 1192 13 ext4_io_end 128 128 64 64 ext4_system_zone 102 102 40 102 fat_cache 0 0 40 102 fat_inode_cache 20 20 792 20 file_lock_cache 36 36 216 18 files_cache 92 92 704 23 filp 950 1360 256 16 fscrypt_info 0 0 128 32 fsverity_info 0 0 256 16 ftrace_event_field 5329 5329 56 73 fuse_inode 0 0 832 19 fuse_request 0 0 152 26 hugetlbfs_inode_cache 12 12 664 12 iint_cache 0 0 128 32 inode_cache 19332 19332 640 12 ip4-frags 0 0 200 20 ip6-frags 0 0 184 22 Cache Num Total Size Pages ip_fib_alias 146 146 56 73 ip_fib_trie 170 170 48 85 jbd2_journal_handle 146 146 56 73 jbd2_journal_head 136 272 120 34 jbd2_revoke_record_s 256 256 32 128 jbd2_revoke_table_s 256 256 16 256 kcopyd_job 0 0 3240 10 kernfs_iattrs_cache 677 736 88 46 kernfs_node_cache 24064 24064 128 32 khugepaged_mm_slot 72 72 112 36 kioctx 0 0 576 14 kmalloc-128 2384 2400 128 32 kmalloc-16 7909 7936 16 256 kmalloc-192 2688 2688 192 21 kmalloc-1k 2060 2064 1024 16 kmalloc-256 1269 1312 256 16 kmalloc-2k 1766 1808 2048 16 kmalloc-32 6244 6400 32 128 kmalloc-4k 1597 1600 4096 8 kmalloc-512 3600 3600 512 16 kmalloc-64 7968 8192 64 64 kmalloc-8 5075 5120 8 512 kmalloc-8k 71 88 8192 4 kmalloc-96 1668 2100 96 42 kmalloc-cg-128 96 96 128 32 kmalloc-cg-16 512 512 16 256 kmalloc-cg-192 105 105 192 21 kmalloc-cg-1k 121 176 1024 16 Cache Num Total Size Pages kmalloc-cg-256 48 48 256 16 kmalloc-cg-2k 256 288 2048 16 kmalloc-cg-32 256 256 32 128 kmalloc-cg-4k 33 48 4096 8 kmalloc-cg-512 128 128 512 16 kmalloc-cg-64 128 128 64 64 kmalloc-cg-8 1024 1024 8 512 kmalloc-cg-8k 4 4 8192 4 kmalloc-cg-96 84 84 96 42 kmalloc-rcl-128 192 192 128 32 kmalloc-rcl-16 0 0 16 256 kmalloc-rcl-192 0 0 192 21 kmalloc-rcl-1k 0 0 1024 16 kmalloc-rcl-256 0 0 256 16 kmalloc-rcl-2k 0 0 2048 16 kmalloc-rcl-32 0 0 32 128 kmalloc-rcl-4k 0 0 4096 8 kmalloc-rcl-512 0 0 512 16 kmalloc-rcl-64 960 960 64 64 kmalloc-rcl-8 0 0 8 512 kmalloc-rcl-8k 0 0 8192 4 kmalloc-rcl-96 294 294 96 42 kmem_cache 192 192 256 16 kmem_cache_node 192 192 64 64 lsm_file_cache 1215 1360 24 170 lsm_inode_cache 37838 37888 32 128 maple_node 604 864 256 16 mm_struct 60 98 1152 14 Cache Num Total Size Pages mnt_cache 478 504 320 12 MPTCP 0 0 1920 17 MPTCPv6 0 0 2112 15 mqueue_inode_cache 17 17 960 17 names_cache 40 40 4096 8 net_namespace 14 14 4480 7 nf_conntrack 144 208 256 16 nsproxy 112 112 72 56 numa_policy 15 15 272 15 ovl_inode 44 44 728 22 pde_opener 204 204 40 102 perf_event 26 26 1248 13 pid 456 608 128 32 pid_namespace 0 0 136 30 PING 16 16 1024 16 PINGv6 13 13 1216 13 proc_dir_entry 525 525 192 21 proc_inode_cache 2170 2185 712 23 radix_tree_node 6956 6986 584 14 RAW 16 16 1024 16 RAWv6 26 26 1216 13 request_queue 17 17 936 17 request_queue_srcu 0 0 1328 12 request_sock_subflow_v4 0 0 384 21 request_sock_subflow_v6 0 0 384 21 request_sock_TCP 26 26 312 13 request_sock_TCPv6 0 0 312 13 scsi_sense_cache 64 64 128 32 Cache Num Total Size Pages seq_file 68 68 120 34 shared_policy_node 595 595 48 85 shmem_inode_cache 1050 1080 784 20 sighand_cache 141 165 2112 15 signal_cache 140 196 1152 14 sigqueue 255 255 80 51 skbuff_ext_cache 63 63 192 21 skbuff_fclone_cache 50 112 512 16 skbuff_head_cache 144 144 256 16 sock_inode_cache 240 247 832 19 task_group 84 84 640 12 taskstats 38 38 416 19 task_struct 188 196 8128 4 TCP 28 28 2304 14 TCPv6 26 26 2432 13 trace_event_file 1806 1806 96 42 tw_sock_TCP 30 90 272 15 tw_sock_TCPv6 15 15 272 15 UDPv6 24 24 1344 12 UNIX 150 150 1088 15 userfaultfd_ctx_cache 0 0 192 21 user_namespace 0 0 624 13 uts_namespace 36 36 432 18 vmap_area 2016 6016 64 64 vm_area_struct 3466 3484 152 26 xfrm_dst_cache 0 0 320 12 xfrm_state 0 0 768 21 -s:显示交换空间统计信息。 root@aly ~# vmstat -s 3648056 K total memory 460812 K used memory 563640 K active memory 452140 K inactive memory 2458904 K free memory 150796 K buffer memory 811856 K swap cache 0 K total swap 0 K used swap 0 K free swap 606193 non-nice user cpu ticks 125 nice user cpu ticks 286752 system cpu ticks 207604164 idle cpu ticks 8236 IO-wait cpu ticks 0 IRQ cpu ticks 33380 softirq cpu ticks 0 stolen cpu ticks 0 non-nice guest cpu ticks 0 nice guest cpu ticks 624433 K paged in 2806553 K paged out 0 pages swapped in 0 pages swapped out 984021844 interrupts 1892748780 CPU context switches 1751594227 boot time 34743 forks netstat netstat是一个强大的命令行工具,用于显示网络连接、路由表、接口统计信息、伪装连接以及多播成员等。 #### 列出所有当前的连接,包括 TCP、UDP 和 UNIX 套接字。 root@aly ~# netstat -a Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 localhost:domain 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:5355 0.0.0.0:* LISTEN tcp 0 0 localhost:domain 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN tcp 0 0 aly:51432 100.100.0.70:http TIME_WAIT tcp 0 352 aly:ssh 113.133.98.9:15292 ESTABLISHED tcp 0 0 aly:51814 100.100.30.26:http ESTABLISHED tcp 0 0 aly:34482 100.100.0.70:https TIME_WAIT tcp 0 0 aly:ssh 113.133.98.9:15175 ESTABLISHED tcp6 0 0 [::]:5355 [::]:* LISTEN tcp6 0 0 [::]:ssh [::]:* LISTEN udp 0 0 0.0.0.0:5355 0.0.0.0:* udp 0 0 localhost:domain 0.0.0.0:* udp 0 0 localhost:domain 0.0.0.0:* udp 0 0 aly:bootpc 0.0.0.0:* udp 0 0 localhost:323 0.0.0.0:* udp6 0 0 [::]:5355 [::]:* udp6 0 0 localhost:323 [::]:* raw6 0 0 [::]:ipv6-icmp [::]:* 7 Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node Path unix 3 [ ] STREAM CONNECTED 18045 /run/dbus/system_bus_socket unix 3 [ ] STREAM CONNECTED 17930 /run/dbus/system_bus_socket unix 3 [ ] DGRAM CONNECTED 14835 unix 3 [ ] STREAM CONNECTED 230876 unix 3 [ ] STREAM CONNECTED 15689 unix 2 [ ] DGRAM CONNECTED 76244 unix 2 [ ] DGRAM 33220 /run/user/0/systemd/notify unix 3 [ ] STREAM CONNECTED 18032 unix 2 [ ACC ] STREAM LISTENING 33223 /run/user/0/systemd/private unix 2 [ ACC ] STREAM LISTENING 33231 /run/user/0/bus unix 2 [ ACC ] STREAM LISTENING 18811 /var/run/docker/libnetwork/17ad54cb5ae3.sock unix 2 [ ACC ] STREAM LISTENING 33233 /run/user/0/gnupg/S.dirmngr unix 2 [ ACC ] STREAM LISTENING 33235 /run/user/0/gnupg/S.gpg-agent.browser unix 2 [ ACC ] STREAM LISTENING 33237 /run/user/0/gnupg/S.gpg-agent.extra unix 2 [ ACC ] STREAM LISTENING 33239 /run/user/0/gnupg/S.gpg-agent.ssh unix 2 [ ACC ] STREAM LISTENING 33241 /run/user/0/gnupg/S.gpg-agent unix 2 [ ACC ] STREAM LISTENING 230116 /tmp/aliyun_assist_service.sock unix 2 [ ACC ] STREAM LISTENING 33243 /run/user/0/pk-debconf-socket unix 3 [ ] STREAM CONNECTED 15693 /run/systemd/journal/stdout unix 3 [ ] STREAM CONNECTED 182361 unix 2 [ ACC ] STREAM LISTENING 15153 /run/systemd/resolve/io.systemd.Resolve unix 2 [ ACC ] STREAM LISTENING 15154 /run/systemd/resolve/io.systemd.Resolve.Monitor unix 3 [ ] SEQPACKET CONNECTED 18074 unix 3 [ ] STREAM CONNECTED 15747 /run/systemd/journal/stdout unix 3 [ ] DGRAM CONNECTED 15610 unix 2 [ ] DGRAM CONNECTED 32641 unix 3 [ ] STREAM CONNECTED 230875 unix 2 [ ] DGRAM CONNECTED 15130 unix 3 [ ] DGRAM CONNECTED 14290 unix 2 [ ] DGRAM CONNECTED 15383 unix 2 [ ACC ] STREAM LISTENING 36720 /run/screen/S-root/3899.pts-0.aly unix 3 [ ] STREAM CONNECTED 16094 /run/containerd/containerd.sock unix 2 [ ] DGRAM CONNECTED 32652 unix 3 [ ] DGRAM CONNECTED 14289 /run/systemd/notify unix 2 [ ACC ] STREAM LISTENING 14292 /run/systemd/private unix 2 [ ACC ] STREAM LISTENING 14294 /run/systemd/userdb/io.systemd.DynamicUser unix 3 [ ] STREAM CONNECTED 15466 /run/systemd/journal/stdout unix 2 [ ACC ] STREAM LISTENING 14295 /run/systemd/io.system.ManagedOOM unix 3 [ ] STREAM CONNECTED 230076 /run/dbus/system_bus_socket unix 2 [ ACC ] STREAM LISTENING 14306 /run/systemd/fsck.progress unix 9 [ ] DGRAM CONNECTED 14310 /run/systemd/journal/dev-log unix 8 [ ] DGRAM CONNECTED 14312 /run/systemd/journal/socket unix 2 [ ACC ] STREAM LISTENING 14314 /run/systemd/journal/stdout unix 3 [ ] STREAM CONNECTED 76831 /run/dbus/system_bus_socket unix 3 [ ] DGRAM CONNECTED 15612 unix 2 [ ACC ] SEQPACKET LISTENING 14317 /run/udev/control unix 3 [ ] STREAM CONNECTED 14822 unix 2 [ ] DGRAM CONNECTED 15299 unix 3 [ ] STREAM CONNECTED 182094 unix 3 [ ] STREAM CONNECTED 17714 unix 3 [ ] SEQPACKET CONNECTED 18075 unix 3 [ ] STREAM CONNECTED 17924 unix 2 [ ] DGRAM CONNECTED 380658 unix 2 [ ACC ] STREAM LISTENING 14401 /run/systemd/journal/io.systemd.journal unix 3 [ ] STREAM CONNECTED 230086 /run/systemd/journal/stdout unix 3 [ ] DGRAM CONNECTED 14836 unix 3 [ ] STREAM CONNECTED 182353 /usr/local/aegis/Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)> unix 3 [ ] STREAM CONNECTED 17931 /run/dbus/system_bus_socket unix 2 [ ] DGRAM CONNECTED 15692 unix 3 [ ] STREAM CONNECTED 230874 unix 3 [ ] STREAM CONNECTED 32695 /run/dbus/system_bus_socket unix 3 [ ] STREAM CONNECTED 15966 unix 3 [ ] STREAM CONNECTED 182096 unix 3 [ ] DGRAM CONNECTED 15611 unix 3 [ ] STREAM CONNECTED 17928 unix 3 [ ] STREAM CONNECTED 15810 /run/systemd/journal/stdout unix 3 [ ] STREAM CONNECTED 16097 /run/containerd/containerd.sock unix 2 [ ACC ] STREAM LISTENING 17689 /run/dbus/system_bus_socket unix 2 [ ACC ] STREAM LISTENING 17692 /run/docker.sock unix 3 [ ] STREAM CONNECTED 182095 unix 3 [ ] STREAM CONNECTED 230868 unix 2 [ ] DGRAM CONNECTED 14403 unix 3 [ ] STREAM CONNECTED 15671 unix 2 [ ] DGRAM CONNECTED 18053 unix 3 [ ] STREAM CONNECTED 33225 unix 3 [ ] STREAM CONNECTED 15834 unix 2 [ ] DGRAM CONNECTED 384127 unix 3 [ ] STREAM CONNECTED 15599 unix 3 [ ] STREAM CONNECTED 33150 /run/systemd/journal/stdout unix 2 [ ] STREAM CONNECTED 383514 unix 3 [ ] STREAM CONNECTED 182145 unix 3 [ ] STREAM CONNECTED 76243 unix 3 [ ] STREAM CONNECTED 17923 unix 2 [ ] DGRAM 18073 /run/chrony/chronyd.sock unix 3 [ ] STREAM CONNECTED 182173 /usr/local/aegis/Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)> unix 3 [ ] STREAM CONNECTED 15114 unix 3 [ ] STREAM CONNECTED 230074 /run/dbus/system_bus_socket unix 3 [ ] STREAM CONNECTED 16096 unix 3 [ ] STREAM CONNECTED 32629 unix 3 [ ] STREAM CONNECTED 18616 unix 2 [ ACC ] STREAM LISTENING 18408 /run/containerd/containerd.sock.ttrpc unix 3 [ ] STREAM CONNECTED 17744 unix 2 [ ACC ] STREAM LISTENING 18411 /run/containerd/containerd.sock unix 3 [ ] STREAM CONNECTED 15291 /run/systemd/journal/stdout unix 3 [ ] DGRAM CONNECTED 14291 unix 3 [ ] DGRAM CONNECTED 33221 unix 2 [ ] STREAM CONNECTED 380996 unix 3 [ ] STREAM CONNECTED 18423 /run/systemd/journal/stdout unix 2 [ ] DGRAM CONNECTED 15822 unix 2 [ ] DGRAM CONNECTED 76809 unix 2 [ ACC ] STREAM LISTENING 18614 /var/run/docker/metrics.sock unix 3 [ ] STREAM CONNECTED 15703 /run/systemd/journal/stdout unix 3 [ ] DGRAM CONNECTED 15613 unix 3 [ ] STREAM CONNECTED 230053 /run/systemd/journal/stdout unix 2 [ ] DGRAM CONNECTED 14831 unix 3 [ ] STREAM CONNECTED 15807 unix 3 [ ] STREAM CONNECTED 182093 unix 3 [ ] STREAM CONNECTED 15806 /run/systemd/journal/stdout unix 3 [ ] STREAM CONNECTED 17927 /run/dbus/system_bus_socket unix 2 [ ACC ] STREAM LISTENING 181244 /usr/local/aegis/Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)> unix 3 [ ] STREAM CONNECTED 15421 /run/systemd/journal/stdout unix 3 [ ] DGRAM CONNECTED 33222 unix 3 [ ] STREAM CONNECTED 17691 #### 列出所有TCP连接 root@aly ~# netstat -at Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 localhost:domain 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:5355 0.0.0.0:* LISTEN tcp 0 0 localhost:domain 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN tcp 0 172 aly:ssh 113.133.98.9:15292 ESTABLISHED tcp 0 0 aly:51814 100.100.30.26:http ESTABLISHED tcp 0 0 aly:54616 100.100.0.70:http TIME_WAIT tcp 0 0 aly:ssh 113.133.98.9:15175 ESTABLISHED tcp6 0 0 [::]:5355 [::]:* LISTEN tcp6 0 0 [::]:ssh [::]:* LISTEN #### 列出所有UDP连接 root@aly ~# netstat -au Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State udp 0 0 0.0.0.0:5355 0.0.0.0:* udp 0 0 localhost:domain 0.0.0.0:* udp 0 0 localhost:domain 0.0.0.0:* udp 0 0 aly:bootpc 0.0.0.0:* udp 0 0 localhost:323 0.0.0.0:* udp6 0 0 [::]:5355 [::]:* udp6 0 0 localhost:323 [::]:* #### 列出所有 TCP 连接,不使用域名解析加快查询速度。 root@aly ~# netstat -ant Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.54:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:5355 0.0.0.0:* LISTEN tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 344 172.22.34.90:22 113.133.98.9:15292 ESTABLISHED tcp 0 0 172.22.34.90:51814 100.100.30.26:80 ESTABLISHED tcp 0 0 172.22.34.90:34512 100.100.0.70:80 TIME_WAIT tcp 0 0 172.22.34.90:22 113.133.98.9:15175 ESTABLISHED tcp6 0 0 :::5355 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN #### 列出所有监听中的 TCP 连接 root@aly ~# netstat -tnl Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.54:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:5355 0.0.0.0:* LISTEN tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp6 0 0 :::5355 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN #### 列出所有监听中的 TCP 连接,并显示进程信息。 root@aly ~# netstat -nlpt Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.54:53 0.0.0.0:* LISTEN 552/systemd-resolve tcp 0 0 0.0.0.0:5355 0.0.0.0:* LISTEN 552/systemd-resolve tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 552/systemd-resolve tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 646/sshd: /usr/sbin tcp6 0 0 :::5355 :::* LISTEN 552/systemd-resolve tcp6 0 0 :::22 :::* LISTEN 646/sshd: /usr/sbin #### 所有协议的统计数据 root@aly ~# netstat -s Ip: Forwarding: 1 1193555 total packets received 9 with invalid addresses 0 forwarded 0 incoming packets discarded 1193545 incoming packets delivered 851630 requests sent out 6 outgoing packets dropped Icmp: 220 ICMP messages received 170 input ICMP message failed ICMP input histogram: destination unreachable: 193 timeout in transit: 22 echo requests: 5 21379 ICMP messages sent 0 ICMP messages failed OutRateLimitHost: 11607 ICMP output histogram: destination unreachable: 13972 echo requests: 7402 echo replies: 5 IcmpMsg: InType3: 193 InType8: 5 InType11: 22 OutType0: 5 OutType3: 13972 OutType8: 7402 Tcp: 21497 active connection openings 780 passive connection openings 40984 failed connection attempts 213 connection resets received 2 connections established 1115207 segments received 797598 segments sent out 1934 segments retransmitted 618 bad segments received 513145 resets sent InCsumErrors: 617 Udp: 52164 packets received 25579 packets to unknown port received 57 packet receive errors 53056 packets sent 0 receive buffer errors 0 send buffer errors InCsumErrors: 57 UdpLite: TcpExt: 40971 resets received for embryonic SYN_RECV sockets 21541 TCP sockets finished time wait in fast timer 8 packets rejected in established connections because of timestamp 643 delayed acks sent 2 delayed acks further delayed because of locked socket Quick ack mode was activated 117 times 21 SYNs to LISTEN sockets dropped 12047 packet headers predicted 35333 acknowledgments not containing data payload received 58439 predicted acknowledgments TCPSackRecovery: 14 Detected reordering 8 times using SACK Detected reordering 37 times using reno fast retransmit TCPDSACKUndo: 6 82 congestion windows recovered without slow start after partial ack TCPLostRetransmit: 385 TCPSackFailures: 5 127 timeouts in loss state 93 fast retransmits 71 retransmits in slow start TCPTimeouts: 1527 TCPLossProbes: 291 TCPLossProbeRecovery: 62 TCPBacklogCoalesce: 242 TCPDSACKOldSent: 97 TCPDSACKRecv: 111 7 connections reset due to unexpected data 116 connections reset due to early user close 37 connections aborted due to timeout TCPDSACKIgnoredNoUndo: 56 TCPSackShifted: 12 TCPSackMerged: 36 TCPSackShiftFallback: 70 TCPRcvCoalesce: 19972 TCPOFOQueue: 302 TCPOFOMerge: 83 TCPChallengeACK: 7 TCPSYNChallenge: 1 TCPAutoCorking: 992 TCPWantZeroWindowAdv: 1391 TCPSynRetrans: 873 TCPOrigDataSent: 132764 TCPHystartDelayDetect: 2 TCPHystartDelayCwnd: 80 TCPKeepAlive: 102 TCPDelivered: 153994 TCPAckCompressed: 2 TcpTimeoutRehash: 643 TcpDuplicateDataRehash: 14 TCPDSACKRecvSegs: 111 IpExt: InMcastPkts: 7 OutMcastPkts: 15 InOctets: 167811181 OutOctets: 109745744 InMcastOctets: 343 OutMcastOctets: 671 InNoECTPkts: 1233785 MPTcpExt: #### 查询内核路由表,并禁用域名解析 root@aly ~# netstat -rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 0.0.0.0 172.22.63.253 0.0.0.0 UG 0 0 0 eth0 100.100.2.136 172.22.63.253 255.255.255.255 UGH 0 0 0 eth0 100.100.2.138 172.22.63.253 255.255.255.255 UGH 0 0 0 eth0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 172.22.0.0 0.0.0.0 255.255.192.0 U 0 0 0 eth0 172.22.63.253 0.0.0.0 255.255.255.255 UH 0 0 0 eth0 #### 网络接口信息 root@aly ~# netstat -i Kernel Interface table Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg docker0 1500 0 0 0 0 0 0 0 0 BMU eth0 1500 1441905 0 0 0 1060061 0 0 0 BMRU lo 65536 24 0 0 0 24 0 0 0 LRU #### 显示多播组信息 root@aly ~# netstat -g IPv6/IPv4 Group Memberships Interface RefCnt Group --------------- ------ --------------------- lo 1 all-systems.mcast.net eth0 1 224.0.0.252 eth0 1 all-systems.mcast.net docker0 1 all-systems.mcast.net docker0 1 224.0.0.106 lo 1 ip6-allnodes lo 1 ff01::1 eth0 1 ff02::1:3 eth0 1 ff02::1:ff12:e82d eth0 2 ip6-allnodes eth0 1 ff01::1 docker0 1 ff02::6a docker0 1 ip6-allnodes docker0 1 ff01::1 使用-c选项可以持续输出查询结果。 mpstat mpstat 是 Linux 系统中用于监控 CPU 性能的工具,属于 sysstat 工具包的一部分。它可以实时显示每个 CPU 核心的详细统计信息,适用于多核 CPU 的性能分析和优化。 mpstat的基本语法如下: mpstat [选项] [间隔时间] [采样次数] 间隔时间:两次采样之间的时间间隔(秒)。 采样次数:采样的总次数。 如果不指定参数,mpstat会显示系统启动以来的平均 CPU 使用情况。 mpstat常用选项 -P {ALL|CPU编号}:指定监控的 CPU 核心,ALL 表示所有核心。 root@aly ~ [1]# mpstat -P ALL Linux 6.1.0-37-amd64 (aly) 07/16/2025 _x86_64_ (2 CPU) 02:07:06 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 02:07:06 PM all 0.29 0.00 0.14 0.00 0.00 0.02 0.00 0.00 0.00 99.55 02:07:06 PM 0 0.28 0.00 0.13 0.00 0.00 0.02 0.00 0.00 0.00 99.57 02:07:06 PM 1 0.30 0.00 0.14 0.00 0.00 0.02 0.00 0.00 0.00 99.53 -u:显示 CPU 使用率(默认)。 -I {SUM|CPU|SCPU|ALL}:显示中断统计信息。 root@aly ~# mpstat -I ALL Linux 6.1.0-37-amd64 (aly) 07/16/2025 _x86_64_ (2 CPU) 02:08:35 PM CPU intr/s 02:08:35 PM all 941.03 02:08:35 PM CPU 1/s 4/s 6/s 8/s 9/s 10/s 11/s 12/s 14/s 15/s 24/s 25/s 26/s 27/s 28/s 29/s 30/s NMI/s LOC/s SPU/s PMI/s IWI/s RTR/s RES/s CAL/s TLB/s TRM/s THR/s DFR/s MCE/s MCP/s ERR/s MIS/s PIN/s NPI/s PIW/s 02:08:35 PM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.88 0.00 0.00 0.00 449.00 0.00 0.00 0.02 0.00 0.14 20.80 0.05 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 02:08:35 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.42 0.00 1.28 0.00 0.00 0.00 0.00 447.47 0.00 0.00 0.02 0.00 0.13 20.85 0.04 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 02:08:35 PM CPU HI/s TIMER/s NET_TX/s NET_RX/s BLOCK/s IRQ_POLL/s TASKLET/s SCHED/s HRTIMER/s RCU/s 02:08:35 PM 0 0.00 11.60 0.00 0.85 0.00 0.00 0.00 19.87 0.00 10.71 02:08:35 PM 1 0.00 11.32 0.00 1.27 0.40 0.00 0.00 21.27 0.00 10.99 -o JSON:以 JSON 格式输出结果。 root@aly ~# mpstat -o JSON {"sysstat": { "hosts": [ { "nodename": "aly", "sysname": "Linux", "release": "6.1.0-37-amd64", "machine": "x86_64", "number-of-cpus": 2, "date": "07/16/2025", "statistics": [ { "timestamp": "02:06:20 PM", "cpu-load": [ {"cpu": "all", "usr": 0.29, "nice": 0.00, "sys": 0.14, "iowait": 0.00, "irq": 0.00, "soft": 0.02, "steal": 0.00, "guest": 0.00, "gnice": 0.00, "idle": 99.55} ] } ] } ] }} -V:显示版本信息。 mpstat输出字段说明 %usr:用户态程序的 CPU 使用率。 %nice:低优先级用户态程序的 CPU 使用率。 %sys:内核态程序的 CPU 使用率。 %iowait:CPU 等待 I/O 操作的时间占比。 %irq:处理硬件中断的时间占比。 %soft:处理软件中断的时间占比。 %steal:虚拟 CPU 等待实际 CPU 的时间占比。 %guest:运行虚拟处理器的时间占比。 %idle:CPU 空闲时间占比。 #### 所有CPU核心的当前统计信息 root@aly ~# mpstat Linux 6.1.0-37-amd64 (aly) 07/16/2025 _x86_64_ (2 CPU) 02:04:12 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 02:04:12 PM all 0.29 0.00 0.14 0.00 0.00 0.02 0.00 0.00 0.00 99.55 iostat iostat(Input/Output Statistics)是Linux系统下一个强大的性能监控工具,属于sysstat工具包的一部分。它主要用于监控系统的磁盘I/O活动情况和CPU使用情况。 iostat基本命令格式 iostat [选项] [时间间隔] [次数] iostat常用选项 -c 显示CPU使用情况 root@aly ~# iostat -c Linux 6.1.0-37-amd64 (aly) 07/16/2025 _x86_64_ (2 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.29 0.00 0.15 0.00 0.00 99.55 -d 显示磁盘使用情况 root@aly ~# iostat -d Linux 6.1.0-37-amd64 (aly) 07/16/2025 _x86_64_ (2 CPU) Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd vda 0.44 0.91 2.93 0.00 961961 3081153 0 -h 以人类可读格式显示(如KB, MB, GB) root@aly ~# iostat -h Linux 6.1.0-37-amd64 (aly) 07/16/2025 _x86_64_ (2 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.3% 0.0% 0.2% 0.0% 0.0% 99.6% tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd Device 0.44 0.9k 2.9k 0.0k 939.4M 2.9G 0.0k vda -k 以KB为单位显示数据 -m 以MB为单位显示数据 -N 显示设备映射名称 -p 显示指定设备或分区的统计信息 -t 显示时间戳 -x 显示扩展统计信息 root@aly ~# iostat -Nx Linux 6.1.0-37-amd64 (aly) 07/16/2025 _x86_64_ (2 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.29 0.00 0.15 0.00 0.00 99.55 Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz f/s f_await aqu-sz %util vda 0.02 0.91 0.01 21.38 0.93 39.12 0.42 2.93 0.12 22.04 0.91 6.96 0.00 0.00 0.00 0.00 0.00 0.00 0.09 0.05 0.00 0.01 -y 跳过首次统计(通常与时间间隔一起使用) -z 省略零活动设备的输出 -j ID 显示指定设备的持久名称 –dec={0|1|2} 指定小数位数 iostat输出结果说明 CPU统计部分 avg-cpu: %user %nice %system %iowait %steal %idle 0.3% 0.0% 0.2% 0.0% 0.0% 99.6% %user:用户级别(应用程序)的CPU使用率 %nice:优先级调整过的进程的CPU使用率 %system:系统级别(内核)的CPU使用率 %iowait:CPU等待I/O操作完成的时间百分比 %steal:虚拟环境中的"被偷走"时间 %idle:CPU空闲时间百分比 磁盘统计部分 tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd Device 0.44 0.9k 2.9k 0.0k 939.4M 2.9G 0.0k vda 0.00 0.0k 0.0k 0.0k 156.0k 0.0k 0.0k vda1 0.00 0.0k 0.0k 0.0k 4.5M 1.0k 0.0k vda2 0.44 0.9k 2.9k 0.0k 933.0M 2.9G 0.0k vda3 tps:每秒传输次数(transfers per second) kB_read/s:每秒读取的数据量(KB) kB_wrtn/s:每秒写入的数据量(KB) kB_read:读取的总数据量(KB) kB_wrtn:写入的总数据量(KB) lsblk lsblk(list block devices)是一个用于列出所有可用块设备信息的命令。它能够显示设备之间的依赖关系,但不会列出RAM盘的信息。块设备包括硬盘、闪存盘、CD-ROM等。lsblk命令包含在util-linux-ng包中,该包现已更名为 util-linux。 lsblk基本用法 lsblk [选项] [<块设备> …] lsblk可用选项 -a, –all:显示所有设备。 root@aly ~# lsblk -a NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 0B 0 loop loop1 7:1 0 0B 0 loop loop2 7:2 0 0B 0 loop loop3 7:3 0 0B 0 loop loop4 7:4 0 0B 0 loop loop5 7:5 0 0B 0 loop loop6 7:6 0 0B 0 loop loop7 7:7 0 0B 0 loop vda 254:0 0 50G 0 disk ├─vda1 254:1 0 1M 0 part ├─vda2 254:2 0 191M 0 part /boot/efi └─vda3 254:3 0 49.8G 0 part / -b, –bytes:以字节方式显示设备大小。 root@aly ~# lsblk -b NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS vda 254:0 0 53687091200 0 disk ├─vda1 254:1 0 1048576 0 part ├─vda2 254:2 0 200278016 0 part /boot/efi └─vda3 254:3 0 53484699136 0 part / -d, –nodeps:不显示从属设备或持有者。 root@aly ~# lsblk -d NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS vda 254:0 0 50G 0 disk -f, –fs:显示文件系统信息。 root@aly ~# lsblk -f NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS vda ├─vda1 ├─vda2 vfat FAT32 742E-4CF1 176.4M 6% /boot/efi └─vda3 ext4 1.0 119607c7-eb0a-4861-9014-0f60caf61fde 42.7G 8% / -m, –perms:显示权限信息。 root@aly ~# lsblk -m NAME SIZE OWNER GROUP MODE vda 50G root disk brw-rw---- ├─vda1 1M root disk brw-rw---- ├─vda2 191M root disk brw-rw---- └─vda3 49.8G root disk brw-rw---- -l, –list:以列表格式显示。 root@aly ~# lsblk -l NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS vda 254:0 0 50G 0 disk vda1 254:1 0 1M 0 part vda2 254:2 0 191M 0 part /boot/efi vda3 254:3 0 49.8G 0 part / -n, –noheadings:不显示标题。 -o, –output :输出列。 -p, –paths:打印设备路径。 -P, –pairs:以键值对格式显示。 -r, –raw:以原始格式显示。 -S, –scsi:输出有关SCSI设备的信息。 -t, –topology:显示拓扑结构信息。 root@aly ~# lsblk -t NAME ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE RA WSAME vda 0 512 0 512 512 1 mq-deadline 256 128 0B ├─vda1 0 512 0 512 512 1 mq-deadline 256 128 0B ├─vda2 0 512 0 512 512 1 mq-deadline 256 128 0B └─vda3 0 512 0 512 512 1 mq-deadline 256 128 0B free free命令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。 free常用参数: -b  以Byte为单位显示内存使用情况。 root@aly ~# free -b total used free shared buff/cache available Mem: 3735609344 524595200 1961779200 2207744 1512284160 3211014144 Swap: 0 0 0 -k  以KB为单位显示内存使用情况。 root@aly ~# free -k total used free shared buff/cache available Mem: 3648056 512296 1915800 2156 1476844 3135760 Swap: 0 0 0 -m  以MB为单位显示内存使用情况。 root@aly ~# free -m total used free shared buff/cache available Mem: 3562 500 1870 2 1442 3062 Swap: 0 0 0 -h 人性化的方式显示内存使用情况。 root@aly ~# free -h total used free shared buff/cache available Mem: 3.5Gi 500Mi 1.8Gi 2.1Mi 1.4Gi 3.0Gi Swap: 0B 0B 0B -s <间隔秒数>  持续观察内存使用状况。 -t  显示内存总和列。 root@aly ~# free -th total used free shared buff/cache available Mem: 3.5Gi 500Mi 1.8Gi 2.1Mi 1.4Gi 3.0Gi Swap: 0B 0B 0B Total: 3.5Gi 500Mi 1.8Gi df df 显示所有文件系统的使用信息,可以快速查看挂在的各个设备使用情况。 df用法: df [OPTION]... [FILE]... 选项说明: -a 显示所有设备 root@aly ~# df -a Filesystem 1K-blocks Used Available Use% Mounted on sysfs 0 0 0 - /sys proc 0 0 0 - /proc udev 1804476 0 1804476 0% /dev devpts 0 0 0 - /dev/pts tmpfs 364808 624 364184 1% /run /dev/vda3 51228028 4234068 44683340 9% / securityfs 0 0 0 - /sys/kernel/security tmpfs 1824028 0 1824028 0% /dev/shm tmpfs 5120 0 5120 0% /run/lock cgroup2 0 0 0 - /sys/fs/cgroup pstore 0 0 0 - /sys/fs/pstore efivarfs 0 0 0 - /sys/firmware/efi/efivars bpf 0 0 0 - /sys/fs/bpf systemd-1 - - - - /proc/sys/fs/binfmt_misc hugetlbfs 0 0 0 - /dev/hugepages mqueue 0 0 0 - /dev/mqueue debugfs 0 0 0 - /sys/kernel/debug tracefs 0 0 0 - /sys/kernel/tracing fusectl 0 0 0 - /sys/fs/fuse/connections configfs 0 0 0 - /sys/kernel/config ramfs 0 0 0 - /run/credentials/systemd-sysctl.service ramfs 0 0 0 - /run/credentials/systemd-sysusers.service ramfs 0 0 0 - /run/credentials/systemd-tmpfiles-setup-dev.service /dev/vda2 192559 11917 180642 7% /boot/efi binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc ramfs 0 0 0 - /run/credentials/systemd-tmpfiles-setup.service tracefs 0 0 0 - /sys/kernel/debug/tracing tmpfs 364804 0 364804 0% /run/user/0 -h 友好阅读模式,进制1024 root@aly ~# df -h Filesystem Size Used Avail Use% Mounted on udev 1.8G 0 1.8G 0% /dev tmpfs 357M 624K 356M 1% /run /dev/vda3 49G 4.1G 43G 9% / tmpfs 1.8G 0 1.8G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock /dev/vda2 189M 12M 177M 7% /boot/efi tmpfs 357M 0 357M 0% /run/user/0 -H 友好阅读模式,进制1000 root@aly ~# df -H Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 374M 639k 373M 1% /run /dev/vda3 53G 4.4G 46G 9% / tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 5.3M 0 5.3M 0% /run/lock /dev/vda2 198M 13M 185M 7% /boot/efi tmpfs 374M 0 374M 0% /run/user/0 i 显示inode信息,默认为块(block) root@aly ~# df -ih Filesystem Inodes IUsed IFree IUse% Mounted on udev 441K 374 441K 1% /dev tmpfs 446K 601 445K 1% /run /dev/vda3 3.2M 105K 3.1M 4% / tmpfs 446K 2 446K 1% /dev/shm tmpfs 446K 2 446K 1% /run/lock /dev/vda2 0 0 0 - /boot/efi tmpfs 90K 22 90K 1% /run/user/0 常用格式为df -hal

2025/7/16
articleCard.readMore

八个天才般的python技巧

使用List推导式实现更清晰的代码 Python 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> s=[x**3 for x in range(10)] >>> s [0, 1, 8, 27, 64, 125, 216, 343, 512, 729] 更具可读性,比传统循环更快。 不需要临时变量交换变量值 >>> a,b=8,9 >>> a,b=b,a >>> print(a,b) 9 8 使用**合并词典 >>> a={'x':1} >>> b={'y':2} >>> c={**a,**b} >>> c {'x': 1, 'y': 2} 毫不费力地将多个词典合并为一行。 使用_获取最后一个输出值 >>> 8+9 17 >>> _**2 289 使用python终端或ipython时可以提高效率。 一行代码实现判断赋值 >>> a=12 >>> s='up' if a>=8 else 'down' >>> s 'up' 较短的条件赋值使代码更加优雅。 分解lists和tuples >>> a,b,*c=[1,2,3,4,5,6] >>> a 1 >>> b 2 >>> c [3, 4, 5, 6] 获取前几个值并打包剩余值,非常适合灵活的任务。 使用enumerate() 替代手动跟踪索引 >>> for i,v in enumerate(['a','b','c','d']): ... print(i,v) ... 0 a 1 b 2 c 3 d 这比for i in range(len(..)) 更python,嘎嘎! 利用 zip()进行并行处理 >>> ns=['alair','toby'] >>> ags=[84,73] >>> for n,a in zip(ns,ags): ... print(f"{n}:{a}") ... alair:84 toby:73 via https://x.com/clcoding/status/1940327836788588625

2025/7/3
articleCard.readMore

斐讯N1恢复原厂系统并重新安装Armbian

有个祖传的N1,装过armbian,后来又安装了openwrt做旁路由,最近想重新装回armbian做server用。 网上找了一圈发现openwrt下无法进行操作,只能先恢复原厂系统,然后重新安装armbian,以下为此次折腾记录。 斐讯N1恢复原厂系统 所需文件如下,下载地址在这里 (访问密码: 3705) Amlogic USB Burning Tool v2.2.exe 烧录工具 T1_1.3T47_mod_by_webpad_v3_20180419.img 临时镜像文件 N1-6.2.3.img 正式镜像文件 SECURE_BOOT_SET 加密文件 安装Amlogic USB Burning Tool v2.2后先别打开,进入到程序安装目录C:\Users\bbq\AppData\Local\Amlogic\USB_Burning_Tool,在里面新建license文件夹,将下载的SECURE_BOOT_SET文件复制进去,再以管理员权限打开USB_Burning_Tool。 使用双USB A公口线将N1靠近HDMI的U口连接到电脑上;如果你的电脑有USB C口,也可以用USB A口插N1,USB C口连接电脑。 将N1后面四角的防滑垫拆下,拆掉四个螺丝去掉后壳。找到如下两个触点,使用镊子或者回形针将其连起来,然后插电开机。 N1触点 USB_Burning_Tool会识别到如 USB3-6 的设备ID,文件->导入烧录包,先选择下载的 T1_1.3T47_mod_by_webpad_v3_20180419.img,右侧勾选 擦除flash 和 擦除bootloader 点击开始。 然后,会必然遇到如下21%进度错误,别慌这是预料内的。 USB_Burning_Tool_21% 点击 停止,文件->导入烧录包,这次选择另一个 N1-6.2.3.img,这次记得 不勾选 右侧的 擦除flash 和 擦除bootloader ,点击开始。 幸运的话一次性就会烧录成功,如下图所示。不行的话各种提示错误,没事,淡定,把上面的过程不停的重复,总会成功滴! 这该死的玄学 😓 USB_Burning_Tool烧录成功 记得,烧录成功后,先点击停止然后断开设备。 N1重新安装Armbian 用到的文件如下,下载地址在这里 (访问密码: 3705) Armbian_25.08.0_amlogic_s905d_bookworm_6.12.33_server_2025.06.15.img armbian镜像文件 Reboot to LibreELEC v1.1.apk 重启引导安装程序 rufus-4.9 镜像写入工具 找个U盘,最好是USB2.0的,这样兼容性好。 使用rufus把armbian镜像文件写入U盘。写完成后电脑可以看到一个名为boot的分区,将Reboot to LibreELEC v1.1.apk复制进去。 U盘插到HDMI旁边的U口,另一个U口插上鼠标,连接显示器加电开机。 提示选择主屏幕应用时,选择 Phicomm TV Launcher,然后点击 文件管理器,在选择 移动存储,如果这里没看到你的U盘,那就是识别问题,重启或者换个U盘重试。 找到刚才复制进去的Reboot to LibreELEC v1.1.apk文件点击,然后会提示 Reboot to LibreELEC? 选择确定重启。 重启后会加载U盘中的Armbian系统,第一次启动会提示当前IP,并为root用户设置密码。 下来会提示选择系统shell,按需设置。 Choose default system command shell: 1) bash 2) zsh 然后是设置新用户 Creating a new user account. Press <Ctrl-C> to abort Please provide a username (eg. your first name):bbq Create user (bbq) password: ******** Repeat user (bbq) password: ******** Please provide your real name:bbq Dear bbq, your account bbq has been created and is sudo enabled. Please use this account for your daily work from now on. 后面还有时区和键盘设置,根据自定义设置即可。完成后即可进入Armbian系统。 armbian linux 此时,你使用的仍然是U盘里的系统,接下来我们使用armbian-install命令来将Armbian安装到N1的eMMC中。 [STEPS] Installing Armbian to internal eMMC... [STEPS] Checking dependencies... ... ... [STEPS] Initializing the environment... ... ... [STEPS] Start selecting device ... 这里选择101 s905d Phicomm-N1 ... ... [STEPS] Which type of filesystem do you want for your root? 这里按需选择磁盘格式 ------------------------------------- ID TYPE ------------------------------------- 1 ext4 2 btrfs ------------------------------------- [ OPTIONS ] Please Input ID (1/2): 1 ... ... [STEPS] Partitioning eMMC ... ... ... ... [STEPS] Processing BOOTFS partition ... ... ... [STEPS] Start processing the rootfs partition... ... ... [ SUCCESS ] Installation successful. Run [ poweroff ],remove the installation media then re-insert the power supply to boot new system. 按照最后提示,输入poweroff关机,拔掉U盘断电,重新插电即可启动Armbian。 Armbian使用实例 为普通账户赋予root权限 首先登录root修改文件权限 root@armbian:~# chown root:root /usr/bin/sudo root@armbian:~# chmod 4755 /usr/bin/sudo root@armbian:~# chown root:root /etc/sudoers /etc/sudo.conf /etc/sudoers.d -R 编辑/etc/sudoers文件,加入bbq ALL=(All:ALL) ALL行,并且使用:wq!强制保存。 root@armbian:~# vi /etc/sudoers 如此设置,bbq账户即可使用sudo命令来获取root权限。 Armbian配置国内软件源 备份原始文件 bbq@armbian:~$ cd /etc/apt/sources.list.d/ bbq@armbian:~$ sudo cp debian.sources debian.sources.bak bbq@armbian:~$ sudo cp armbian.sources armbian.sources.bak 修改软件源 bbq@armbian:~$ sudo sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/debian.sources bbq@armbian:~$ sudo sed -i 's%security.debian.org%mirrors.ustc.edu.cn/debian-security%g' /etc/apt/sources.list.d/debian.sources bbq@armbian:~$ sudo sed -i 's%apt.armbian.com%mirrors.ustc.edu.cn/armbian%g' /etc/apt/sources.list.d/armbian.sources 修改后的最终文件在此提供下载 armbian.sources debian.sources (访问密码: 3705) ### armbian.sources Types: deb URIs: http://mirrors.ustc.edu.cn/armbian Suites: bookworm Components: main bookworm-utils bookworm-desktop Signed-By: /usr/share/keyrings/armbian-archive-keyring.gpg ### debian.sources Types: deb URIs: http://mirrors.ustc.edu.cn/debian Suites: bookworm bookworm-updates bookworm-backports Components: main contrib non-free non-free-firmware Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg Types: deb URIs: http://mirrors.ustc.edu.cn/debian-security Suites: bookworm-security Components: main contrib non-free non-free-firmware Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg 更新系统,安装必备软件 bbq@armbian:~$ sudo apt update&&sudo apt upgrade bbq@armbian:~$ sudo apt install wget curl vim tmux git p7zip -y N1硬盘测速 bbq@armbian:~$ sudo hdparm -tT /dev/mmcblk2 /dev/mmcblk2: Timing cached reads: 2098 MB in 2.00 seconds = 1049.01 MB/sec Timing buffered disk reads: 446 MB in 3.00 seconds = 148.61 MB/sec inxi系统配置 bbq@armbian:~$ inxi -F System: Host: armbian Kernel: 6.12.33-ophub arch: aarch64 bits: 64 Console: pty pts/0 Distro: Armbian GNU/Linux 12 (bookworm) Machine: Type: ARM System: Phicomm N1 details: N/A serial: QDB3******910 CPU: Info: quad core model: ARMv8 v8l variant: cortex-a53 bits: 64 type: MCP Speed (MHz): avg: 1512 min/max: 100/1512 cores: 1: 1512 2: 1512 3: 1512 4: 1512 Graphics: Device-1: meson-gxl-dw-hdmi driver: meson_dw_hdmi v: N/A Device-2: meson-gxl-vpu driver: meson_drm v: N/A Device-3: meson-gxl-mali driver: lima v: kernel Display: server: No display server data found. Headless machine? tty: 146x43 API: N/A Message: No display API data available in console. Headless machine? Audio: Device-1: meson-gxl-dw-hdmi driver: meson_dw_hdmi Device-2: gx-sound-card driver: gx_sound_card API: ALSA v: k6.12.33-ophub status: kernel-api Network: Device-1: meson-gxbb-dwmac driver: meson8b_dwmac IF: eth0 state: up speed: 1000 Mbps duplex: full mac: 4e:1c:a*****:35 Device-2: ethernet-phy-id0181.4400 driver: Meson GXL Internal PHY Device-3: pwm-clock driver: pwm_clock IF-ID-1: ip6tnl0 state: down mac: 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 IF-ID-2: sit0 state: down mac: 00:00:00:00 IF-ID-3: tailscale0 state: unknown speed: -1 duplex: full mac: N/A IF-ID-4: wlan0 state: down mac: 22:24:f******a:ae Bluetooth: Device-1: meson-gx-uart driver: meson_uart Report: rfkill ID: hci0 rfk-id: 0 state: down bt-service: not found rfk-block: hardware: no software: no address: see --recommends Drives: Local Storage: total: 7.28 GiB used: 2.07 GiB (28.4%) ID-1: /dev/mmcblk2 type: Removable model: 8GME4R size: 7.28 GiB Partition: ID-1: / size: 6.31 GiB used: 1.92 GiB (30.4%) fs: ext4 dev: /dev/mmcblk2p2 ID-2: /boot size: 510 MiB used: 150.6 MiB (29.5%) fs: vfat dev: /dev/mmcblk2p1 ID-3: /var/log size: 46.8 MiB used: 2 MiB (4.2%) fs: ext4 dev: /dev/zram1 Swap: ID-1: swap-1 type: zram size: 957.3 MiB used: 0 KiB (0.0%) dev: /dev/zram0 Sensors: Src: /sys Message: No sensor data found in /sys/class/hwmon. Info: Processes: 132 Uptime: 1h 34m Memory: 1.87 GiB used: 267.5 MiB (14.0%) Init: systemd target: graphical (5) Shell: Bash inxi: 3.3.26

2025/6/26
articleCard.readMore

树莓派硬盘测速

在树莓派上测试硬盘速度可以帮助你了解存储设备的性能。以下是两种常用的方法: 使用hdparm测速 hdparm 是一个用于测试磁盘读写速度的工具。 安装hdparm sudo apt install hdparm 使用hdparm测速 root@raspi2b ~# lsblk #检查设备名 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS mmcblk0 179:0 0 29.3G 0 disk ├─mmcblk0p1 179:1 0 128M 0 part /boot/firmware └─mmcblk0p2 179:2 0 29.2G 0 part / root@raspi2b ~# sudo hdparm -Tt /dev/mmcblk0 #使用hdparm测速 /dev/mmcblk0: Timing cached reads: 1026 MB in 2.00 seconds = 512.59 MB/sec Timing buffered disk reads: 64 MB in 3.09 seconds = 20.68 MB/sec 以上实例中,/dev/mmcblk0代表SD卡存储设备。-T 代表从缓存读取速度,-t 代表从目标位置的读取速度。 使用dd命令测速 root@raspi2b ~# sudo dd if=/dev/mmcblk0 of=/dev/null bs=1M count=1024 status=progress 1065353216 字节 (1.1 GB, 1016 MiB) 已复制,48 s,22.2 MB/s 输入了 1024+0 块记录 输出了 1024+0 块记录 1073741824 字节 (1.1 GB, 1.0 GiB) 已复制,48.3631 s,22.2 MB/s 以上实例中,if=/dev/mmcblk0 指定输入文件为 SD 卡设备,of=/dev/null 将读取的数据丢弃,bs=1M 设置块大小为 1MB,count=1024 读取 1024 个块,总计 1GB 数据,status=progress 显示进度信息。

2025/6/21
articleCard.readMore

命令行模式使用dbxcli管理dropbox网盘

dbxcli是一款dropbox命令行客户端,通过它可以便携的在命令行模式下管理dropbox内容,dbxcli功能如下: 支持基本的文件作,如 ls、cp、mkdir、mv 支持搜索 支持文件修订和文件恢复 大文件的分块上传,大目录的分页列表 安装dbxcli 通过官方发布页下载对应的系统文件 wget https://github.com/dropbox/dbxcli/releases/download/v3.0.0/dbxcli-linux-amd64 mv dbxcli-linux-amd64 /usr/local/bin/dbxcli chmod +x /usr/local/bin/dbxcli dbxcli使用实例 关联dropbox账号 通过dbxcli account来进行账号关联,运行后会提示让访问一个url,按照提示访问并授权,然后将dropbox提示的api request验证码粘贴至dbxcli完成验证即可。 ➜ ~ dbxcli account 1. Go to https://www.dropbox.com/1/oauth2/authorize?client_id=07****jfsd***f9&response_type=code&state=state 2. Click "Allow" (you might have to log in first). 3. Copy the authorization code. Enter the authorization code here: bR***miYqHoA******yDLEyh2ft3d********* Logged in as bbq <dotbbq@gmail.com> Account Id: dbid:AACE7******7UoEko Account Type: basic Locale: zh-CN Referral Link: https://www.dropbox.com/referrals/***XJRk**********XewBy2b9******Of8c?src=app9-934508 Profile Photo Url: Paired Account: false ➜ ~ dropbox使用情况 ➜ ~ dbxcli du Used: 3.2 GiB Type: individual Allocated: 20 GiB dbxcli常用文件操作 cp 复制文件 get 下载文件 ls 列出文件 mkdir 创建目录 mv 移动文件 put 上传文件 restore 恢复文件 revs 查询修改记录 rm 移除文件 search 搜索 ➜ ~ dbxcli put v2rayN-windows-64.7z /updir/v2rayN-windows-64.7z Uploading 41 MiB/41 MiB ➜ ~ dbxcli ls /updir/ /updir/v2rayN-windows-64.7z ➜ ~ dbxcli revs /updir/v2rayN-windows-64.7z 637ab1d715d691d1ce78a ➜ ~ dbxcli get /updir/v2rayN-windows-64.7z Downloading 41 MiB/41 MiB dbxcli团队管理命令 ➜ ~ dbxcli team --help Team management commands Usage: dbxcli team [command] Available Commands: add-member 添加成员 info 团队信息 list-groups 组信息 list-members 组成员 remove-member 移除组成员 Flags: -h, --help help for team Global Flags: --as-member string Member ID to perform action as -v, --verbose Enable verbose logging Use "dbxcli team [command] --help" for more information about a command.

2025/6/16
articleCard.readMore

DuckDB导入导出Excel数据

DuckDB导入Excel数据 DuckDB支持从Excel导入数据,但只支持.xlsx,不支持.xls。如果原始数据是.xls就需要用excel2007及以上版本打开重新保存为.xlsx格式。 DuckDB导入excel工作表 在select语句中使用read_xlsx函数读取excel文件,默认读取第一个sheet。 SELECT * FROM read_xlsx('test.xlsx'); 方便的是,可以省略read_xlsx函数,DuckDB也会自适应判断文件类型进行读取。 SELECT * FROM 'test.xlsx'; read_xlsx函数有许多参数可自定义,如sheet参数可指定工作表名称。 SELECT * FROM read_xlsx('test.xlsx', sheet = 'Sheet2'); DuckDB导入excel指定范围数据 下面实例使用range参数,指定A1:B2范围数据,A1为左上角单元格,B2为右下角单元格。 SELECT * FROM read_xlsx('test.xlsx', range = 'A1:B2'); 下面实例表示跳过前5行 SELECT * FROM read_xlsx('test.xlsx', range = 'A5:Z'); 下面实例表示跳过前5列 SELECT * FROM read_xlsx('test.xlsx', range = 'E:Z'); 默认情况下,如果没有指定范围,当遇到空行时,DuckDB将停止读取Excel文件。但是当提供了一个范围时,默认是读取到范围的末尾。 以上行为可以通过stop_at_empty参数来控制: -- 读取前100行,或直到遇到第一个空行,以先到者为准 SELECT * FROM read_xlsx('test.xlsx', range = '1:100', stop_at_empty = true); -- 始终读取整个工作表即使它包含空行 SELECT * FROM read_xlsx('test.xlsx', stop_at_empty = false); DuckDB读取excel并创建新表 以下实例表示读取test.xlsx文件中的Sheet2工作表,并创建名为newtb的新表。 CREATE TABLE newtb AS SELECT * FROM read_xlsx('test.xlsx', sheet = 'Sheet2'); DuckDB读取excel并插入已有表 以下表示读取test.xlsx中的Sheet2并将数据插入oldtb表。 INSERT INTO oldtb SELECT * FROM read_xlsx('test.xlsx', sheet = 'Sheet2'); 或者使用copy也可以插入数据 COPY oldtb FROM 'test.xlsx' (FORMAT xlsx, SHEET 'Sheet2'); 使用COPY语句将Excel文件插入到现有表中时,目标表中列的类型将强制为Excel工作表中单元格的类型。 导入数据时设置是否包含header SELECT * FROM read_xlsx('test.xlsx', header = true); 默认情况下,如果第一行中的所有单元格都是非空字符,则第一行将被视为header。要禁用此行为,请将header设置为false。 数据类型检测 导入数据时,DuckDB会自动检测导入列数据类型。 单元格如果是数字的话,可能匹配为TIMESTAMP , TIME , DATE 和 BOOLEAN 类型。 包含TRUE 和 FALSE 的文本单元格可能匹配为 BOOLEAN 类型。 默认情况下,空单元格的类型为DOUBLE 。 其他情况,根据单元格的内容推断为 VARCHAR 或 DOUBLE 。 还可以通过设置 empty_as_varchar参数来控制空单元格类型检测方式。 将所有空单元格处理为 VARCHAR 而不是 DOUBLE ,将 empty_as_varchar 设置为 true : SELECT * FROM read_xlsx('test.xlsx', empty_as_varchar = true); 禁用类型推断并将所有单元格设置为 VARCHAR,将 all_varchar设置为 true : SELECT * FROM read_xlsx('test.xlsx', all_varchar = true); 将 ignore_errors 参数设置为 true , DuckDB会将不能断列类型的单元格替换为 NULL。 SELECT * FROM read_xlsx('test.xlsx', ignore_errors = true); DuckDB导出Excel 同数据导入,DuckDB只支持将数据导出为.xlsx文件。 将数据表导出为excel文件 COPY tb TO 'output.xlsx' WITH (FORMAT xlsx); 查询结果也可以直接导出为Excel文件: COPY (SELECT * FROM tb) TO 'output.xlsx' WITH (FORMAT xlsx); 使用 HEADER 选项将表头写入Excel文件的第一行,: COPY tb TO 'output.xlsx' WITH (FORMAT xlsx, HEADER true); 使用 SHEET 选项设置工作表名称: COPY tb TO 'output.xlsx' WITH (FORMAT xlsx, SHEET 'newSheet'); 导出数据类型转换 Excel实际上只支持存储数字或字符串——相当于 VARCHAR 和 DOUBLE ,当导出XLSX文件时会按以下规则进行类型转换: 数值类型被强制转换为 DOUBLE 时间类型( TIMESTAMP , DATE , TIME 等)被转换为excel“序列号”,即日期为1900-01-01以来的天数,时间为一天的小数。然后用“数字格式”进行样式设置,以便在Excel中打开时显示为日期或时间。 TIMESTAMP_TZ 和 TIME_TZ 分别转换为UTC TIMESTAMP 和 TIME ,时区信息丢失。 BOOLEAN转换为 1 和 0 ,并应用“数字格式”使它们在Excel中显示为 TRUE 和 FALSE 。 所有其他类型都被强制转换为 VARCHAR ,然后写入文本单元格 除了以上规则,也可以在导出Excel之前自定义将列转换为不同的类型: COPY (SELECT CAST(a AS VARCHAR), b FROM tb) TO 'output.xlsx' WITH (FORMAT xlsx); 参考 https://duckdb.org/docs/stable/guides/file_formats/excel_import https://duckdb.org/docs/stable/guides/file_formats/excel_export.html

2025/6/5
articleCard.readMore