为什么我的 python 代码使我的服务器停滞不前?
Why is my python code bogging down my server?
我是 python 的新手,正在尝试编写自己的系统日志程序。我已经在我自己的机器上测试过了,它工作正常,我没有注意到任何东西。现在,当我将它放在我的 Ubuntu VM 上时,它会使 CPU(由 'top' 和 vSphere 报告)达到 80-99%。我从我的 i5 (3.1 GHz) 处理器中分配了 1 CPU 个内核。如果有的话,也许是文件打开和关闭导致了这个峰值,但这对我来说并不合适。在此先感谢您的帮助!
import socket
log= input("Enter full path of file you would like to monitor:\n")
host =input("Enter IP address for remote syslog server:\n")
port =input("Enter syslog service port to send syslogs to:\n")
port=int(port)
with open(log,'r') as file:
current_pos = 0
data=file.read().splitlines()
old_len=0
file.close()
while True:
new_len=len(data)
udp_port = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
with open(log,'r') as file:
data=file.read().splitlines()
while new_len > old_len and current_pos < new_len:
msg=data[current_pos]
print('Sending....',msg,'=====>',host,':',port)
udp_port.sendto(bytes(msg, "utf-8"), (host, port))
current_pos+=1
file.close()#Is this necessary here?
old_len=new_len
#udp_port.shutdown()#stay open only during transmission
udp_port.close()
您的代码有一个 while True:
块。这意味着它将一遍又一遍地循环,不断地从你的文件中读取。 CPU 获得的唯一中断是阻塞调用(例如网络和其他 I/O),您的线程将在 I/O 资源可用之前产生 CPU 时间。
为避免扰乱 CPU,您应该在 while
循环的末尾插入一个 sleep()
调用。即使是 10 毫秒的休眠也应该给你低延迟,但在 CPU.
上放松一下
我是 python 的新手,正在尝试编写自己的系统日志程序。我已经在我自己的机器上测试过了,它工作正常,我没有注意到任何东西。现在,当我将它放在我的 Ubuntu VM 上时,它会使 CPU(由 'top' 和 vSphere 报告)达到 80-99%。我从我的 i5 (3.1 GHz) 处理器中分配了 1 CPU 个内核。如果有的话,也许是文件打开和关闭导致了这个峰值,但这对我来说并不合适。在此先感谢您的帮助!
import socket
log= input("Enter full path of file you would like to monitor:\n")
host =input("Enter IP address for remote syslog server:\n")
port =input("Enter syslog service port to send syslogs to:\n")
port=int(port)
with open(log,'r') as file:
current_pos = 0
data=file.read().splitlines()
old_len=0
file.close()
while True:
new_len=len(data)
udp_port = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
with open(log,'r') as file:
data=file.read().splitlines()
while new_len > old_len and current_pos < new_len:
msg=data[current_pos]
print('Sending....',msg,'=====>',host,':',port)
udp_port.sendto(bytes(msg, "utf-8"), (host, port))
current_pos+=1
file.close()#Is this necessary here?
old_len=new_len
#udp_port.shutdown()#stay open only during transmission
udp_port.close()
您的代码有一个 while True:
块。这意味着它将一遍又一遍地循环,不断地从你的文件中读取。 CPU 获得的唯一中断是阻塞调用(例如网络和其他 I/O),您的线程将在 I/O 资源可用之前产生 CPU 时间。
为避免扰乱 CPU,您应该在 while
循环的末尾插入一个 sleep()
调用。即使是 10 毫秒的休眠也应该给你低延迟,但在 CPU.