python ftp服务器限速_ftp如何做到精确限速?

需求:在线上集群的某一台机器部署ftp服务端,其他机器通过ftp客户端每天定时get数据,由于集群上跑了很多服务,为了不影响其他服务需要对ftp进行限速

现方案:使用python的pyftplib搭建了简单的ftp服务端,客户端使用Linux NetKit的ftp,python的限速代码片段:

# limit for bandwidth

dtp_handler = ThrottledDTPHandler

dtp_handler.read_limit = 30 * 1024 * 1024 # 30 MB/s

dtp_handler.write_limit = 30 * 1024 * 1024 # 30 MB/s

# Instantiate FTP handler class

handler = FTPHandler

handler.authorizer = authorizer

handler.dtp_handler = dtp_handler

目前问题:通过网络监控并没有发现把网卡打满的情况(CPU、内存、磁盘IO也都远没有达到报警阈值),但集群上部署的其他服务却出现了大量的延时报警,分析了一下原因,可能是由于ftp限速和网络监控都是基于秒级的,但服务监控是基于毫秒级的,ftp服务端在1秒内达到了限速阈值就不再处理了,但在达到阈值的这短时间内却已经占用了大量带宽,从而影响了其他进程,pyftplib实现限速的代码片段:

def _throttle_bandwidth(self, len_chunk, max_speed):

"""A method which counts data transmitted so that you burst to

no more than x Kb/sec average.

"""

self._datacount += len_chunk

if self._datacount >= max_speed:

self._datacount = 0

now = timer()

sleepfor = (self._timenext - now) * 2

if sleepfor > 0:

# we've passed bandwidth limits

def unsleep():

if self.receive:

event = self.ioloop.READ

else:

event = self.ioloop.WRITE

self.add_channel(events=event)

self.del_channel()

self._cancel_throttler()

self._throttler = self.ioloop.call_later(

sleepfor, unsleep, _errback=self.handle_error)

self._timenext = now + 1

请问:

1、我分析的原因是否正确?如果不正确问题还可能出在哪?

2、如果正确,有没有简单的方式或成熟的解决方案可实现更精确的限速?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值