CPU时间/数据库查询时间详解

其实本文是写在Hostker手册的,搬过来当更新凑数。【喂

之前在多个地方提到过CPU时间和数据库的查询时间,部分Hostker用户表示不太理解如何计算,这里来详细解释一下。

CPU时间

首先是CPU时间,这货是Linux系统的系统态(也叫内核态)和用户态的时间总和,在Hostker环境里我们只计算php的CPU时间。关于这个时间的计算可能需要一个例子来演示,我们在Linux里经常用到一个time命令测试程序的执行时间,得到的结果就像下面这样:

time foo
real 0m0.023s
user 0m0.000s
sys 0m0.004s

这里real是该程序的总执行时间,user是用户态时间,sys是系统态时间。我们平时看到的Discuz之类的程序底部显示的时间其实是real时间,就相当于执行程序的时候你记下unix时间戳,执行完你再记一下unix时间戳,两者之间相差的就是real时间。

在弄明白为什么分系统态和用户态时间之前,我们有必要先了解一下这两个时间。举个例子,对任何操作系统来说,创建一个新的子进程肯定是核心级的功能,因为需要做很多底层的工作,消耗系统的物理资源,比如分配物理内存,从父进程复制信息,复制设置页目录页表等等。这些自然不能让哪个程序都能去做,于是需要引出一个概念——特权级别。

关于特权级别下面引用一部分资料:
=======================================================================

特权级显然是非常有效的管理和控制程序执行的手段,因此在硬件上对特权级做了很多支持,就x86架构的CPU来说一共有0~3四个特权级,0级最高,3级最低,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查,相关的概念有CPL、DPL和RPL,这里不再过多阐述。硬件已经提供了一套特权级使用的相关机制,软件自然就是好好利用的问题,这属于操作系统要做的事情,对于Unix/Linux来说,只使用了0级特权级和3级特权级。也就是说在Unix/Linux系统中,一条工作在0级特权级的指令具有了CPU能提供的最高权力,而一条工作在3级特权级的指令具有CPU提供的最低或者说最基本权力。

内核态(Kernel Mode):

在内核态,代码拥有完全的,不受任何限制的访问底层硬件的能力。可以执行任意的CPU指令,访问任意的内存地址。内核态通常情况下,都是为那些最底层的,由操作系统提供的,可信可靠的代码来运行的。内核态的代码崩溃将是灾难性的,它会影响到整个系统。

用户态(User Mode):

在用户态,代码不具备直接访问硬件或者访问内存的能力,而必须借助操作系统提供的可靠的,底层的APIs来访问硬件或者内存。由于这种隔离带来的保护作用,用户态的代码崩溃(Crash),系统是可以恢复的。我们大多数的代码都是运行在用户态的。

=======================================================================

看到这里相信你已经能猜到了,当程序运行在3级特权级上的时候,就是用户态;当程序运行在0级特权级上的时候,就是系统态(内核态)。它们的时间总和,就是Hostker日志记录的CPU时间。

你觉得这就完了吗?还没!看看下面的例子:
# time sleep 1

real 0m1.009s
user 0m0.000s
sys 0m0.000s

“诶?????”你肯定在这么想。程序在暂停、执行网络操作(远程API通讯之类的)、进行数据库查询的时间并不是CPU时间。因此别被Discuz之类的程序的执行时间忽悠啦!实际的CPU时间并不大,用户可以在HTTP请求头部找到我们的CPU时间,单位是毫秒。(1s秒=1000ms毫秒)

数据库查询时间

数据库查询时间指的是MySql接到查询请求,执行完这条查询所消耗的时间。并不包括发送和接收请求所消耗的时间,所以Hostker的计费方式是非常公平的。用户在phpMyAdmin里执行操作的时候经常可以看到类似“查询花费 0.0051 秒”的字样,这里指的就是数据库查询时间。

同上,可以在HTTP请求头部找到我们的数据库查询时间,单位是微秒。(1s秒=1000000μs微秒)

CPU时间/数据库查询时间详解 没有评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据