技术博客 > 正文

CDN Pro 的”CPU时间“统计值的技术细节

2022-03-18

目的

CDN行业长期以来一直采取以带宽,流量,或者请求数为单位的计价方式。但是在实际运营过程中,不同的业务类型在以上提到的三个统计值一样的情况下,成本可能非常的不一样。主要原因是对服务器的消耗很不一样。比如10Gbps的大文件下载业务可能一台服务器就能胜任,但是同样带宽的动态业务可能需要200台服务器。一个CDN平台的成本除了带宽以外,还有很多是跟服务器数量直接相关的,包括服务器本身,机柜,电力,网络设备,运输,仓储等等。如果仅仅以带宽报价,在不了解业务的情况下,很难确定一个合理的价格。往往不是自身无法盈利,就是客户认为太高。特别是在市场竞争日趋激烈,价格越发接近成本的时候,我们需要一个方式来准确统计业务对服务器的消耗,并作为计费值。这样一方面我们自身可以确保盈利,另一方面也给客户提供了更高的价格透明度。我们发现业务在服务器上的最主要瓶颈就是CPU,因此我们决定在CDN Pro平台上提供一个”CPU时间“或者”CPU核心数“的统计值。这个统计值与带宽或者流量相结合,可以更加全面的描述一个CDN平台最主要的两块成本来源。

实现

CDN Pro采用的反向代理服务器是基于开源软件nginx。而nginx是一款基于单线程,无阻塞,事件驱动架构的服务器软件。我们在每一个事件处理流程的开始和结束都通过系统调用clock_gettime()获取线程处理该事件的CPU耗时,并记录到该事件相关的HTTP请求上。我们在流量日志和访问日志里都分别以域名粒度和请求粒度记录了消耗的CPU时间。这种方式:
● 可以记录:nginx进程消耗在直接处理每条请求的用户层和系统层的时间。
● 无法记录:服务器上其他进程,内核的中断处理,以及nginx在公共事务上的时间
尽管有这些局限性,我们发现nginx记录的这个CPU消耗与整台服务器的CPU消耗有很好的相关性。提供了一种方式以服务域名或者客户粒度来分摊业务与机器相关的成本。为了验证这个数值的准确性和可靠性,我们将其与Linux操作系统统计的整机CPU时间(/proc/stat)进行了对比,结果如下图所示:

羊毛党盯上了政府消费劵 惠民助商大计如何保障?

这是某台服务器24小时内Linux操作系统统计的CPU使用率(绿线),nginx统计的CPU使用率(黄线)以及两者的比值(蓝线)。时间粒度是15分钟。黄线的计算方法是nginx在每个15分钟时间段内累计的总CPU时间除以15分钟,得到消耗的物理核数,再除以该服务器的总CPU物理核数。

可以看出,两者的相关性是非常高的。比例始终在60%左右。从这张散点图可以更清楚看出两者的相关性:

羊毛党盯上了政府消费劵 惠民助商大计如何保障?

CDN Pro服务器统计到的CPU使用时间与整机的CPU消耗有非常好的相关性。将其乘以系数1.6可以得到对整机CPU消耗的一个很好的估计,从而估算整个平台与服务器数量相关的所有成本。该统计值可以很方便地在服务域名或者客户间分摊,非常适合作为一个各种粒度的成本估算以及定价的依据。