- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 python 脚本,它会启动并向各个域发出大量 HTTP 和 urllib 请求。
我们有大量域需要处理,需要尽快处理。由于 HTTP 请求很慢(即它们可能会超时,因为域上没有网站)我在任何时候都运行许多脚本,从数据库中的域列表中获取它们。
我看到的问题是在一段时间内(几小时到 24 小时)脚本都开始变慢并且 ps -al 显示它们正在休眠。
服务器非常强大(8 核、72GB 内存、6TB Raid 6 等 80MB 2:1 连接)并且永远不会达到极限,即 Free -m
显示
-/+ buffers/cache: 61157 11337
Swap: 4510 195 4315
顶部显示 80-90% 空闲
sar -d 显示平均 5.3% util
更有趣的是,iptraf 以大约 50-60MB/s 的速度开始,大约 4 小时后以 8-10MB/s 的速度结束。
我目前在每台服务器(2 台服务器)上运行大约 500 个版本的脚本,它们都显示相同的问题。
ps -al
显示大多数 python 脚本都在休眠,我不明白为什么例如:
0 S 0 28668 2987 0 80 0 - 71003 sk_wai pts/2 00:00:03 python
0 S 0 28669 2987 0 80 0 - 71619 inet_s pts/2 00:00:31 python
0 S 0 28670 2987 0 80 0 - 70947 sk_wai pts/2 00:00:07 python
0 S 0 28671 2987 0 80 0 - 71609 poll_s pts/2 00:00:29 python
0 S 0 28672 2987 0 80 0 - 71944 poll_s pts/2 00:00:31 python
0 S 0 28673 2987 0 80 0 - 71606 poll_s pts/2 00:00:26 python
0 S 0 28674 2987 0 80 0 - 71425 poll_s pts/2 00:00:20 python
0 S 0 28675 2987 0 80 0 - 70964 sk_wai pts/2 00:00:01 python
0 S 0 28676 2987 0 80 0 - 71205 inet_s pts/2 00:00:19 python
0 S 0 28677 2987 0 80 0 - 71610 inet_s pts/2 00:00:21 python
0 S 0 28678 2987 0 80 0 - 71491 inet_s pts/2 00:00:22 python
执行的脚本中没有 sleep 状态,所以我不明白为什么 ps -al 显示大多数人都在 sleep ,以及为什么当 CPU、内存、磁盘访问时,随着时间的推移,他们发出的 IP 请求会越来越慢和带宽都是可用的。
如果有人能提供帮助,我将不胜感激。
编辑:
代码量很大,因为我通过它使用异常来捕获有关域的诊断信息,即我无法连接的原因。如果需要,会在某处发布代码,但通过 HTTPLib 和 URLLib 的基本调用直接来自 python 示例。
更多信息:
两者
配额-u mysql配额-u root
一无所获
nlimit -n 返回 1024更改 limit.conf 以允许 mysql 允许 16000 个软连接和硬连接,并且到目前为止能够运行超过 2000 个脚本,但问题仍然存在。
好的,所以我已经为用户更改了所有限制,确保所有套接字都已关闭(它们没有关闭),尽管情况有所好转,但我的速度仍然变慢了,虽然没有那么糟糕。
有趣的是,我还注意到一些内存泄漏 - 脚本运行时间越长,使用的内存就越多,但我不确定是什么原因造成的。我将输出数据存储在一个字符串中,然后在每次迭代后将其打印到终端,我也确实在最后清除了该字符串,但是不断增加的内存是否会下降到存储所有输出的终端?
编辑:不,似乎不是——运行了 30 个脚本而没有输出到终端,仍然是同样的泄漏。我没有使用任何聪明的东西(只是字符串、HTTPlib 和 URLLib)- 想知道 python mysql 连接器是否有任何问题...?
最佳答案
检查盒子和运行脚本的用户的 ulimit
和 quota
。 /etc/security/limits.conf
也可能包含您可能想要修改的资源限制。
ulimit -n
将显示允许打开的文件描述符的最大数量。
您还可以使用 ls -l/proc/[PID]/fd/
检查 fd,其中 [PID]
是其中一个脚本的进程 ID。
需要查看一些代码以了解实际情况..
编辑(导入评论和更多故障排除想法):
你能展示一下你打开和关闭连接的代码吗?
当只是运行一些脚本进程时,它们是否也开始运行一段时间后空闲?还是仅当同时运行数百个以上脚本时才会发生这种情况?
是否存在启动所有这些脚本的单个父进程?
如果您使用 s = urllib2.urlopen(someURL)
,请确保在完成后使用 s.close()
。 Python 可以经常 为您关闭一些东西(比如如果您执行 x = urllib2.urlopen(someURL).read()
),但它会将它留给 你 如果你被告知(例如将变量分配给 .urlopen()
的返回值)。仔细检查您打开和关闭的 urllib 调用(或所有 I/O 代码以确保安全)。如果每个脚本被设计为一次只有 1 个打开的套接字,并且您的 /proc/PID/fd
显示每个脚本进程有多个事件/打开的套接字,那么肯定有一个 代码 要解决的问题。
ulimit -n
显示 1024
给出 limit 打开 socket/fd mysql 用户可以拥有,您可以使用 ulimit -S -n [LIMIT_#]
更改此设置,但请先查看这篇文章:
Changing process.max-file-descriptor using 'ulimit -n' can cause MySQL to change table_open_cache value .
您可能需要注销并在之后重新登录。和/或将其添加到 /etc/bashrc
(如果您更改了 bashrc
,请不要忘记 source/etc/bashrc
并且不想要注销/登录)。
磁盘空间 是我发现的另一件事(困难的方法)会导致非常奇怪的问题。我遇到过一些进程表现得好像它们正在运行(不是僵尸化)但没有执行预期的操作,因为它们打开了一个日志文件的句柄,该句柄位于剩余磁盘空间为零的分区上。
netstat -anpTee | grep -i mysql
还将显示这些套接字是否已连接/已建立/正在等待关闭/等待超时/等。
watch -n 0.1 'netstat -anpTee | grep -i mysql'
在漂亮的表输出中实时查看套接字打开/关闭/更改状态/等(可能需要export GREP_OPTIONS=
首先,如果你将它设置为类似 --color=always
的东西。
lsof -u mysql
或 lsof -U
也会显示打开的 FD(输出非常冗长)。
import urllib2
import socket
socket.settimeout(15)
# or settimeout(0) for non-blocking:
#In non-blocking mode (blocking is the default), if a recv() call
# doesn’t find any data, or if a send() call can’t
# immediately dispose of the data,
# a error exception is raised.
#......
try:
s = urllib2.urlopen(some_url)
# do stuff with s like s.read(), s.headers, etc..
except (HTTPError, etcError):
# myLogger.exception("Error opening: %s!", some_url)
finally:
try:
s.close()
# del s - although, I don't know if deleting s will help things any.
except:
pass
一些手册页和引用链接:
关于python - 多个 Python 进程缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7619259/
我最近从 Indigo“升级”到了 Luna(Oracle OEPE 安装)。请注意围绕“升级”一词的引用。 不幸的是,事情很慢。 我使用的项目是一个 Maven 多模块项目。构建工作区操作大约需要
如果我的 JavaScript 事件似乎都不是网页性能问题的原因,我该如何诊断网页性能问题? 我有一个使用jqGrid的网络应用程序。单击网格会导致 2-3 秒的卡住,然后发生任何事情(包括点击任何单
从 appengine 访问我的应用程序时,我经常收到以下错误。有人可以知道这是什么原因吗? 原因:com.google.apphosting.api.DeadlineExceededExceptio
出于某种原因,我的 curl 调用非常慢。这是我使用的代码。 $postData = "test" $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $
Stackdriver 测试我的网站启动速度慢 我们使用 cloudflare 作为我们的站点 CDN 提供商。我们使用 stackdriver 从外部测试站点可用性,我们将时间检查间隔设置为 1 分
在插入/更新许多行时,我知道SQLite的“问题”,但事实并非如此。 我正在更新包含约250条记录的表中的ONE一行(由PK索引)中的ONE字段。查询通常需要200毫秒左右的时间。听起来很少,但很大。
我们的 Mongo 数据库会定期(有时每天一次)变慢约 30-40 分钟。在此缓慢时期,访问数据库的 API 会遇到每 5-10 分钟就会出现一次的高延迟峰值。 查看 mongod 日志文件,这两
这个问题已经在这里有了答案: 已关闭8年。 Possible Duplicate: C# WinForm Application - UI Hangs during Long-Running Oper
我最近将我的 Java Liquibase 版本从 3.5.3 升级到 3.6.3 我有一个非常繁重的环境,其中有很多数据库和表(我使用的是 Oracle)。 在这种环境下,我试图执行一个巨大的变更日
在我的项目中,为了整洁起见,模块被组织在子目录中。 我的项目目录层次结构: $ ls -R .: configure.in Makefile.am Makefile.cvs src
我正在 Debian 上使用存储库中的软件包运行 Gitlab。大多数时候Gitlab运行速度非常快,但是在较长的空闲时间后Gitlab非常慢甚至超时(错误502)。有一次我在远程 git 访问上也遇
这可能是菜鸟的错误,所以请原谅我。我在高处和低处寻找解决方案,但没有结果-因此,我想在此添加第一篇文章:-) 我有两个域类,一个称为Domain,一个称为Page。如下代码所示,域中有许多页面。 cl
我是 React 的新手,在使用 onChange 时遇到了问题在大数据列表中生成的输入字段上的方法。 如 parentcomponent是数据的拥有者,我提供了handleUpdate()子组件 (
我们使用 Webpack DefinePlugin 为不同的渲染模式生成输出包。因此,例如,我们的 webpack 配置将返回 [{ entry: { mode1: "./in
我在页面顶部有一个带有菜单的标题元素。当我向下滚动时,标题会动画到较低的高度。当我向上滚动并到达顶部时,标题会以动画方式显示为原始大小。 但它的工作并不完美。有时,事情发生之前需要两秒钟。特别是当我向
我今天在我的文本编辑器(Sublime)中写了一些正则表达式,试图快速找到特定的源代码段,这需要有点创意,因为有时函数调用可能包含更多函数调用。例如,我正在寻找 jQuery 选择器: $("div[
ParentSadly 我没有通过搜索“laggy/slow mouse wheel-scrolling in Rich Edit control”和类似的句子找到答案。 我创建了一个丰富的编辑控件
我遇到了“OR”运算符在 mysql 中未使用任何索引的典型性能问题: SELECT sms.smsID, sms.phonenumber, sms.text, date, mbr.name, mbr
我最近一直在玩 asyncio 模块。下面是我想出的用于发送一些并行请求的代码,这些请求在我的笔记本电脑 (Mac OS) 上似乎运行良好,但在另一台机器 (Ubuntu 18.04) 上似乎运行缓慢
我目前正在开发一个并行应用程序(C#、WinForms),它通过 COM 将消息注入(inject)应用程序。 此应用程序使用多个 foreach 语句,从接受 COM 的应用程序中轮询实体指标。 L
我是一名优秀的程序员,十分优秀!