在Linux上,使用time优雅的统计程序运行时间

Linux服务器TIME_WAIT堆积的实战调优指南 本文深入解析Linux服务器TIME_WAIT状态堆积问题,提供TCP连接调优的实战指南。通过调整内核参数如`tcp_tw_reuse`和`tcp_max_tw_buckets`,优化短连接和长连接配置,有效解决高并发场景下的端口耗尽问题。文章还涵盖监控方法和架构层面的优化建议,帮助运维人员提升服务器性能。 阅读详情

最近在使用 time 命令时,无意间发现了一些隐藏的小秘密和强大功能,今天分享给大家。

time 在 Linux 下是比较常用的命令,可以帮助我们方便的计算程序的运行时间,对比采用不同方案时程序的运行性能。看似简单的命令,其实蕴藏着很多细节和技巧,来跟着肖邦一起学习吧。

1 基础用法详解

先来看下最基础的用法,也可能是大家最常见的用法了

root@chopin:~$ time find . -name "chopin.txt"
......
real   0m0.174s
user   0m0.084s
sys    0m0.084s

可以很清楚看到,find 命令执行的时间为 0.174s,是不是很简单,很方便呢

不过,time 命令输出了三个参数,我们只用到了第一个参数,其它两个参数代表什么含义呢?

这里我来解释一下:

  • real:表示的是墙上时间,说白了,其实就是从程序运行开始到结束所经历的时间;

  • user:表示程序运行期间,cpu 在用户态所花费的时间;

  • sys:表示程序运行期间,cpu 在内核态所花费的时间;

细心的读者会发现,上述案例中的 user + sys 不等于 real,这是怎么回事呢?

其实上边解释的 user 和 sys,是 cpu 执行指令所消耗的时间,并不包含:进程阻塞 IO、调度排队,这些非 cpu 运行时间。

案例中 find 执行查找文件过程中,会有磁盘 IO 读取,这时 cpu 会被释放出来干别的事情,这些 IO 消耗的时间,是不包含在 user 和 sys 统计数据中,所以就出现了 real 时间大于 user + sys 了。

再通过一个示例来验证并加强我们的理解

root@chopin:~$ time sleep 2
real   0m2.001s
user   0m0.000s
sys    0m0.000s

可以清楚地看到,sleep 命令基本上没有消耗 cpu,程序真实的运行时间就是 2 秒

那我们是不是可以得出如下结论了呢:

real >= user + sys

其实这个结论在单个 cpu 情况下,是正确的。

如果服务器是多个 cpu,你的程序正好可以将多个 cpu 充分利用起来,程序运行期间是多核心并行的,那么 user + sys 统计的 cpu 时间可能就会大于 real 时间啦

所以这 3 个时间之间的关系并不是恒定的,你需要清楚的了解服务器是否为多个核心。

通过统计到的 cpu 消耗时间,我们也可以大概知道,程序运行期间 cpu 利用情况。对于单核,计算密集型的程序,real 会很接近 user 和 sys 时间之和的。

Tips:有些同学可能对操作系统可能不太熟悉,这里简单科普下内核态和用户态的基本概念

Linux 为使系统更稳定,采取了隔离保护的措施,运行状态分为内核态和用户态:

  • 用户态:用户代码不具备直接访问底层资源的能力,需要借助内核提供的系统调用 API。在这种隔离保护下,即使用户程序崩溃,也不会影响整个系统的功能。

  • 内核态:内核代码具备最大权限,可执行任意 cpu 指令,不受任何限制。内核态通常是操作系统提供的最底层、最可靠的代码运行的,内核态的代码崩溃是灾难性的,影响整个系统的正常运行。

2 你运行的可能是假time

time 还有其它功能吗?看一下帮助文档吧

root@chopin:~$ time --help
--help: command not found
real 0m0.129s
user 0m0.084s
sys 0m0.036s

竟然报错,将 --help 当成了命令来执行了,难道 time 就这么点能耐吗?

好吧,我也不卖关子了,直接说答案:你运行的可能是假time。你可能有点懵逼,怎么就假的了。

其实在 Linux 系统上,使用 time 时,你可能会遇到三种版本:

# 1. Bash
time is a shell keyword
# 2. Zsh
time is a reserved word
# 3. GNU time
time is /usr/bin/time

我们当前 Shell 是 Bash,可以通过 type 命令

root@chopin:~$ type time
time is a shell keyword

可以看到,我们刚才执行的 time 是 Shell 的内置命令,如果你用的是 zsh,默认使用的 time 也是对应内置命令。

GNU time 命令路径是 /usr/bin/time,一般的 Linux 发行版都带有这个命令,它才是我们今天的猪脚。

3 更强大的功能

GNU time 命令提供了更强大的功能:

  • 更详细的统计信息

  • 更丰富的格式输出

  • 支持保存统计数据到文件

下边我们来学习写 GNU time 的使用

1. 最简单的用法

root@chopin:~$ /usr/bin/time sleep 2
0.00user 0.00system 0:02.00elapsed 0%CPU (0avgtext+0avgdata 1784maxresident)k
0inputs+0outputs (0major+72minor)pagefaults 0swaps

使用 GNU time 命令,直接使用绝对路径即可,我们可以看到输出信息更多了,不过格式有点丑,后边会讲如何自定义格式。

2. 保持内置 time 的输出样式

有同学会问,能输出内置 Shell 那种的格式么?可以的,使用 -p 选项即可

root@chopin:~$ /usr/bin/time -p sleep 2
real 2.00
user 0.00
sys  0.00

3. 输出更详细的信息

还可以输出更加详细的信息,让你对程序运行信息一目了然。请使用 -v 选项

root@chopin:~$ /usr/bin/time -v sleep 2
Command being timed: "sleep 2"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 1804
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 71
Voluntary context switches: 1
Involuntary context switches: 1
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

这里详细介绍下 time 命令输出各项指标

(一)时间相关

图片

(二)内存相关

图片

(三)IO 相关

图片

4. 统计信息输出到文件

如果你希望将 time 统计的信息输出到文件,可以使用 -o 选项

root@chopin:~$ /usr/bin/time -v -o a.txt sleep 2

统计信息直接保存到了 a.txt,如果你希望统计信息能够追加到文件,可以额外加 -a 选项

5. 自定义格式输出

如果命令中内置的输出格式,不符合你的需求,GNU time 可以支持自定义输出格式,通过选项 -f 可以各种指标参数

/usr/bin/time -f "real %e\nuser %U\nsys %S\n" sleep 1
real 1.00
user 0.00
sys  0.00

具体支持的格式,贴心的肖邦已经帮你整理好了

图片

这些格式参数太多了,平时大部分情况用不到,可以收藏起来,以便后期使用时可以快速参考。

4 在性能分析中的作用

看到这么多系统参数指标,难免会有同学会感到疑惑,这些参数能干什么呀?

其实这些指标,对应到操作系统 cpu、内存、IO 这几方面。深刻的理解了这些指标参数,可以帮助你从本质上把握程序的运行情况,甚至可以协助你分析程序的性能瓶颈。

下边我简单解释几个概念,希望能起到抛砖引玉的作用。

(一)CPU 时间

cpu 时间包括:real、user、sys,当 user + sys >= real 时,说明该程序是计算密集型;当 user + sys 远小于 real 时,说明存在较多的 IO 等待。

(二)上下文切换

平时所说的上下文,是指进程的运行环境,包括当时的寄存器值、内存堆栈等信息,内核可以根据上下文完全恢复一个被打断的进程任务。

当执行系统调用、进程切换时,都会产生上下文切换。切换上下文时,操作系统需要为进程保存和恢复上下文信息。

上下文切换分为主动和被动两种,主动上下文切换多,说明存在较多的阻塞调用;被动上下文切换说明 cpu 使用率高。

当上下文切换过多时,意味着较多的 cpu 时间花费在上下文切换上,导致 cpu 处理进程任务的有效时间大大减少。

(三)缺页异常

次缺页异常较多,说明程序的内存布局相对合理,命中率高;当主缺页异常较多时,说明程序对内存的访问跳跃性大,命中率低。

处理缺页异常和切换上下文的时间,不包含在 user 和 sys 中,当发现 user + sys 远小于 real 时,则很可能大部分时间都消耗在这些地方,需要重点分析这两点。

Linux内核TIME_WAIT状态套接字:高并发场景下的优雅舞者 Linux内核中的TIME_WAIT状态机制实现了TCP连接关闭时的可靠终止。通过轻量化的inet_timewait_sock结构体(仅为完整socket的1/3大小)和双重哈希表(ehash/bhash)设计,内核高效管理处于TIME_WAIT状态的连接。核心机制包括:精确的定时器控制(基于RTO动态计算超时)、三重引用计数确保生命周期安全、RCU无锁遍历实现高性能并发访问。该设计既保证了处理延迟报文的可靠性,又通过Slab分配器、NUMA感知等优化手段,使系统能够支持千万级并发连接,展现了Linux网络 阅读详情

相关推荐

Linux统计时间的方法

详细给出在Linux下统计程序运行时间的各种方法和API

Linux 系统设置 : time 命令详解

time命令用于统计给定命令所花费的总时间。 语法 time(参数) 参数 指令:指定需要运行的额指令及其参数。 实例 当测试一个程序或比较不同算法时,执行时间是非常重要的,一个好的算法应该是用时最短的。所有类UNIX系统都包含time命令,使用这个命令可以统计时间消耗。例如: [root@localhost ~]# time ls anaconda-ks.cfg instal...

yexiang优快云的专栏 1725

vscode中使用PlatformIO创建工程加载慢

解决使用VSCODE+PlatformIO中,第一次新建工程一直加载的问题

Reasally的博客 4974

time命令以及结果解读(查看某命令花费的时间)

time命令可以查看一个进程的执行时间(某些Shell不能使用time命令,而是使用自己内建的计时程序)。如果我们想查看一个命令花费的时间就可以使用time。 使用方式很简单time的参数就是我们需要查看花费时间的命令,如下: $ time cc test.c real 0m8.106s user 0m0.972s sys 0m0.767s 这里解释一下输出的结果: real:时钟时间(Clock time),有时被称为墙时钟时(wall clock time),是进程运行花费的时间总和,这个时间取

ZhongUncle的博客 2208

Matlab激活失败?手把手教你解决License checkout failed问题(附详细截图)

本文针对Matlab激活后出现“License checkout failed”错误的常见问题,提供了详细的解决方案。核心在于精准定位并正确填写Windows系统用户名,而非计算机名或账户全名。文章通过分步截图和命令指引,手把手教你使用`whoami`命令获取正确信息,并重新运行激活程序,从根本上解决因用户名填写错误导致的许可检查失败问题。

weixin_29062823的博客 571

Jetson AGX Orin到手必看:DP线选错黑屏、SSD不识别?这篇避坑指南帮你一次搞定

本文详细介绍了Jetson AGX Orin开发套件的硬件避坑指南,涵盖开箱检查、DP线选择、SSD兼容性等关键问题。通过实测数据和实用技巧,帮助开发者避免黑屏、存储不识别等常见问题,提升开发效率。特别推荐符合VESA认证的DP 1.4a线缆和兼容性优秀的SSD型号,确保设备稳定运行。

weixin_33696822的博客 433

linux统计时间

linux 时间获取,计算时间差,查看性能

steem 677

CoppeiaSim(VREP)入门

vrep/CoppeliaSim关节抖动问题原因总结【Coppeliasim|轨迹规划(一)】设置机械臂的关节角时保证机械臂不散架设置机械臂的关节角时保证机械臂不散架。

weixin_50624597的博客 3227

Python:time、timeit、datetime统计代码运行时间

简介:统计代码运行时间无外乎设置开始时间 - 运行程序 - 获取结束时间 - 统计差额,另外需要考虑多次执行求平均值,这样才更准确。常规统计代码运行时间的三种方法:缺点是统计单次,灵活度低,统计粗糙。1、使用time模块设置开始时间 - 运行程序 - 获取结束时间 - 统计差额2、使用datetime模块设置开始时间 - 运行程序 - 获取结束时间 - 统计差额3、常规方法的升级版 - 装饰器所以正常情况下更推荐使用timeit模块进行统计小段代码的运行时间,更有助于得到精确的时间,以检查代码的性能。案例源

we chat:玩转测试开发 1223

【AI生成】市面上主流自组网厂家的技术及市场研究

经过对全球自组网产业技术特征与市场格局的系统分析,本文得出以下核心结论:技术演进呈现智能化与融合化双轨路径 当前自组网技术创新已突破传统组网架构局限,形成"协议优化-架构创新-场景适配"的递进式发展路径。国际厂商聚焦智能算法应用,如Silvus采用深度学习实现动态拓扑优化,传输时延较传统方案降低37%;国内企业则侧重异构网络融合,中国移动设计院提出的5G LAN架构使工业场景通信可靠性提升至99.99%。

qq_31310977的博客 1696

YOLOv11涨点改进 | 全网独家创新,注意力改进篇 | TGRS 2025 | 引入APCM自适应像素级协同机制,动态增强目标区域、抑制背景噪声,助力YOLOv11做红外小目标检测有效涨点

本文提出了一种基于APCM模块改进的YOLOv11网络模型,通过像素级局部-全局协同建模增强目标特征并抑制背景噪声。APCM模块采用轻量化设计,无需复杂参数,能有效提升小目标检测性能。文章详细介绍了APCM的原理、优势及其在红外小目标检测中的应用,包括模块结构、核心代码实现和YAML配置文件修改方法。实验结果表明,该方法在NUAA-SIRST和IRSTD-1K数据集上优于现有技术,显著提高了复杂场景下的检测精度与鲁棒性。

Ai缝合怪、助力小伙伴高效发论文 116

linux time命令使用示例:统计命令的执行时长

在Linux系统中,time命令是一个用于测量程序执行时间及系统资源使用的工具。它可以帮助你了解命令或程序运行期间的性能指标。以下是关于time。

学亮编程手记 1018

AE 与 ISP 参数联动机制解析:自动曝光系统与图像信号处理模块协同设计实践

AE(自动曝光)并不是一个独立的图像控制模块,而是与 ISP(Image Signal Processor)深度耦合运作的系统协同体。其输出的曝光参数直接决定了图像处理链路中 Gamma 曲线选择、黑电平补偿、去噪级别、边缘增强等一系列关键参数的取值。本文基于主流平台(如高通、MTK、海思)的工程实战经验,详细剖析 AE 与 ISP 在曝光驱动、调节优先级、图像还原逻辑等环节的联动机制,并结合拍照与视频等不同场景,给出可落地的联调方法。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1527

在 Linux 上使用 time 命令优雅的统计程序运行时间

最近在使用 time 命令时,无意间发现了一些隐藏的小秘密和强大功能,今天分享给大家。 time 在 Linux 下是比较常用的命令,可以帮助我们方便的计算程序的运行时间,对比采用不同方案时程序的运行性能。看似简单的命令,其实蕴藏着很多细节和技巧,来跟着肖邦一起学习吧。 1 基础用法详解 先来看下最基础的用法,也可能是大家最常见的用法了 root@chopin:~$ time find . -name "chopin.txt" ...... real 0m0.174s user 0m0.084s s

1173

lammps 案例:高熵合金FeNiCrCoCu建模及拉伸模拟

高熵合金力学性能模拟包括拉伸、剪切、摩擦等模拟,本文以高熵合金FeNiCrCoCu为例介绍高熵合金建模及拉伸过程模拟。 FeNiCrCoCu原子数量比为1:1:1:1:1 高熵合金的拉伸与单晶拉伸过程类似,主要包含以下步骤: 1.建模 高熵合金含有原子类型较多,建模时,一般以含量最多的原子为主建立初始模型。 使用set type/ratio或者set type/fraction的方式按一定比例替换为其它合金原子。 如随机选择20%的原子1,将其转换为原子2: set type 1 type/ratio 2

lammps_jiayou的博客 6067

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

/usr/bin/time 使用记录和参数解析(一)

参考/usr/bin/time -v 显示内容含义在Linux上,使用time优雅的统计程序运行时间源码。

antRain的博客 1164

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Linux实用技巧(二),如何动态实时查看日志,时间戳快速转换,推荐收藏

在 Linux 中,你可以使用 SCP(安全复制)命令来在计算机之间复制文件。例如,要将本地计算机上的一个名为file.txt的文件复制到远程计算机上的一个名为destination_folder的文件夹中,你可以在命令行中使用scp file.txt username@remote_host:destination_folder。6. 动态实时查看日志通过tail命令-f选项,...

fastboot 765

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

liunx系统计算程序执行的时间

优雅的计算程序运行时间 在 Linux 下,可以通过 time 命令,很容易获取程序的运行时间: $time./test real0m1.003s user0m0.000s sys0m0.000s 可以看到,程序的运行时间为: 1.003s。细心的同学,会看到 real 貌似不等于 user + sys,而且还远远大于,这是怎么回事呢? 先来解释下这三个参数的含义: real:表示的钟表时间,也就是从程序执行到结束花费的时间; user:表示运行期间,cpu ...

够浪 338

电子协会 C语言 2级 18 、 找第一个只出现一次的字符 (2021 真题 )

电子协会 C语言 2级 18 、 找第一个只出现一次的字符 (2021 真题 )

青少年趣味编程 553

PHP-Daemon信号处理完整指南:优雅关闭、重启与状态监控

在构建生产就绪的守护进程时,**PHP-Daemon信号处理**是实现优雅关闭、安全重启和实时监控的关键技术。PHP-Daemon框架内置了完善的信号处理机制,让开发者能够轻松构建稳定可靠的后台服务。本文将深入探讨如何使用PHP-Daemon的信号处理功能,帮助您掌握守护进程的生命周期管理技巧。 ## 🔔 为什么信号处理如此重要? 在Linux/Unix系统中,信号是进程间通信的基本方式之一

gitblog_00775的博客 462

深入Linux内核:图解TIME_WAIT的2MSL与`tcp_fin_timeout`调优实践

本文深入解析Linux内核中TIME_WAIT状态的2MSL机制与`tcp_fin_timeout`调优实践,通过图解和内核代码分析TCP连接终止过程,提供针对不同业务场景的参数调优方案,有效解决端口耗尽和高并发连接问题,提升服务器网络性能。

weixin_30752699的博客 450

C++实现Linux网络流量监控:基于/proc的轻量级统计程序

网络流量监控是系统运维和性能分析的基础技术,其核心原理是通过采集网络接口的数据包计数信息,计算实时速率与累计流量。在Linux系统中,实现流量统计有多种技术路径,其中读取/proc/net/dev文件因其零依赖和极低开销,成为轻量级监控场景的首选方案。该方案通过轮询内核暴露的累计字节计数器,结合时间差计算,即可获得精准的带宽数据,技术价值在于能以近乎零开销的方式集成到各类基础设施监控体系中。其典型应用场景包括服务器带宽监控、网络异常流量发现以及应用性能基线分析。本文以C++工程实践为例,详细剖析了基于生产者

weixin_33928137的博客 297

linux查看apache进程,以及类unix上开启,关闭,重启

为什么80%的码农都做不了架构师?>>> ...

weixin_33805743的博客 1610

Linux服务器TIME_WAIT过多?tcp_tw_reuse和tcp_tw_recycle的实战避坑指南

本文深入解析Linux服务器TIME_WAIT状态过多的成因与风险,提供tcp_tw_reuse和tcp_tw_recycle内核参数的实战避坑指南。重点阐述tcp_tw_reuse在时间戳机制下的安全使用场景,并警示已废弃的tcp_tw_recycle参数在NAT环境中的危害。同时,从连接池、长连接等应用架构层面,给出立体化的优化解决方案。

p5l2m9n4o6q的博客 181
上一篇: 批量迁移网络
下一篇: 不得不说的vmware学习路线
工具人01
博客等级 码龄11年 1175粉丝 96原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值