【发布时间】:2014-10-08 01:35:32
【问题描述】:
我的环境是本地机器: Ubuntu 12.04 ArangoDB 2.2.4 或 2.2.3 perl 驱动程序(ArangoDB) CPU:3核6线程 内存:3GB
我使用了保存方法。保存方法等于 HTTP_GET 和 HTTP_POST。 执行结果如下:
- 一个perl进程,插入30000个文档。平均 700 个请求/秒。 350 HTTP_GET 和 350 HTTP_POST。
- 10个perl进程,插入30000个文档。平均 1000 个请求/秒。 500 个 HTTP_GET 和 500 个 HTTP_POST。
运行 30 秒后,它会报告 HTTP 500 错误。我修改了 perl 驱动程序(ArangeDB)代码以重试它。这样我就可以完成这个测试了。
arangodb 的日志在它报告 HTTP 500 错误时跟随。
2014-10-04T14:46:47Z [26642] DEBUG [./lib/GeneralServer/GeneralServerDispatcher.h:403] shutdownHandler called, but no handler is known for task
2014-10-04T14:46:47Z [26642] DEBUG [./lib/GeneralServer/GeneralServerDispatcher.h:403] shutdownHandler called, but no handler is known for task
我希望我的程序可以执行平均 3000-5000 个请求/秒并减少 HTTP 500 错误。我可以使用哪些改进。谢谢!
2014 年 7 月 10 日更新,我的插入示例脚本如下。我用 AQL 替换了保存方法。 一个 perl 进程,插入 10000 个文档,平均 900 个请求/秒,1000 个 HTTP_POST/秒。 (没有 HTTP 500) 一个 perl 进程,插入 30000 个文档,平均 700 个请求/秒,700 个 HTTP_POST/秒。 (会发出HTTP 500,需要重试)
#!/usr/bin/perl
use warnings;
use strict;
use ArangoDB;
my $itdb = ArangoDB->new(
{
host => '10.211.55.2',
port => 8529,
keep_alive => 1,
}
);
# Find or create collection
$itdb->create('Node_temp',{isVolatile => JSON::true});
ImpNodes();
sub ImpNodes{
for(1..30000){
my $sth = $itdb->query('INSERT {
"id": "Jony",
"value": "File",
"popup": "public",
"version": "101",
"machine": "10.20.18.193",
"text": {
"Address": ["center","bold","250","100"]
},
"menuitem":[
{
"value": "New",
"onclick": "CreateNewDoc",
"action": "CreateNewDoc"
}
,
{
"value": "Open",
"onclick": "OpenNewDoc",
"action": "OpenNewDoc"
},
{
"value": "Close",
"onclick": "CloseDoc",
"action": "CloseDoc"
},
{
"value": "Save",
"onclick": "SaveDoc",
"action": "SaveDoc"
}]
} in Node_temp');
my $cursor = $sth->execute({
do_count => 1,
batch_size => 10,
});
}
}
我已经修改了 Arangodb-0.08 以便在 Connection.pm 中顺利插入。 http_post 方法:
$retries = 100 #for testing
for(1..$retries){
( undef, $code, $msg, undef, $body ) = $self->{_http_agent}->request(
%{ $self->{_req_args} },
method => 'POST',
path_query => $path,
headers => $headers,
content => $data,
);
last if ( $code < 500 || $code >= 600 );
print "The return code is 5xx,retry http_post!\n";
print $code, " : " , $msg , " : " , $body;
select(undef, undef, undef, 3);
}
【问题讨论】:
-
是否有任何消息返回 HTTP 500 错误?此外,是否可以为您的 perl 测试程序提供修改后的驱动程序以进行复制?
-
真的有必要做一个GET和一个POST操作吗?保存文档只需要一个 HTTP POST,所以我猜您正在发出 GET 以确保该文档还不存在,对吧?如果您的目标只是保存文档,则可以完全省略 HTTP GET。
-
返回的消息是“500:内部响应:无法连接到 10.211.55.2:8529:无法在 /home/netdisco/.pleenv/versions/5.19.8/lib/perl5/ 分配请求的地址site_perl/5.19.8/ArangoDB/Connection.pm 第 73 行。”。该消息来自 Connection.pm 中的 http_post。
-
我使用来自 perl CPAN 的“ArangoDB-0.08”。在“save”方法中,“$self->{connection}->http_post( $api, $data )”将发送http_post,而“ArangoDB::Document->new( $self->{connection}, $res ) ->fetch" 将发送 http_get.我觉得没关系。我可以修改它,并删除http_get。
-
我附上了我的测试程序。非常感谢!
标签: arangodb