我想使用apachebench(ab)来测试文件上传性能.我已阅读手册,无法找到实现目标的方法.
我的目标是尝试使用POST方法和multipart/form-data格式通过HTTP请求上传文件.
ab支持"-p POST-FILE",但我只能找到格式key = value&key2 = value2
我要发送的帖子数据是什么
内容类型:multipart/form-data; 边界= ---- WebKitFormBoundaryuUlX4554LPBjInc5
------ WebKitFormBoundaryuUlX4554LPBjInc5 Content-Disposition:form-data; NAME = "文件"; filename ="411c40d9.jpg"内容类型:image/jpeg
XXXXXXXXXXXXXXX(图像数据)YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
我google了一段时间,找不到任何相关的文章或方法来实现这一点.我使用cURL,它工作正常,但我想做压力测试.所以我需要用ab来实现这个目标.
有什么建议?
我正在开发一个有点不同寻常的应用程序,其中10k客户正好计时,每隔3分钟左右一次尝试提交数据.这个'ab'命令相当准确地模拟了现实世界中的一个弹幕:
ab -c 10000 -n 10000 -r "http://example.com/submit?data=foo"
Run Code Online (Sandbox Code Playgroud)
我在Rackspacecloud VPS实例上使用Ubuntu 12.4上的Node.js来收集这些提交,但是,我看到Node的一些非常奇怪的行为,即使我删除了所有的业务逻辑并将http请求变为no-运.
当测试完成大约90%时,它会挂起很长一段时间.奇怪的是,这种情况一直发生在90% - 对于c = n = 10k,在9000; 对于c = n = 5k,在4500; 对于c = n = 2k,在1800.测试实际上最终完成,通常没有错误.但ab和节点日志都显示连续处理直到测试运行的大约80-90%,然后在完成之前长时间停顿.
当节点正常处理请求时,CPU使用率通常约为50-70%.在挂起期间,CPU上升到100%.有时它会保持在0附近.在不稳定的CPU响应和它看起来与实际连接数无关(只有%完成)的事实之间,我不怀疑垃圾收集器.
我试过在localhost和远程服务器上运行'ab' - 效果相同.
我怀疑与TCP堆栈有关的东西,可能涉及关闭连接,但我的配置更改都没有帮助.我的变化:
Sysctl的变化是:
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_max_orphans = 20000
net.ipv4.tcp_max_syn_backlog = 10000
net.core.somaxconn = 10000
net.core.netdev_max_backlog = 10000
Run Code Online (Sandbox Code Playgroud)
我也注意到我倾向于在内核日志中获得这个消息:
TCP: Possible SYN flooding on port 80. Sending cookies. Check SNMP counters.
Run Code Online (Sandbox Code Playgroud)
我很困惑这个消息,因为TCP积压队列应该足够深,永远不会溢出.如果我禁用syn …
我在ab上运行了一些测试,当我使用超过155的并发级别时,我得到以下内容:
SSL handshake failed (5).
SSL handshake failed (5).
SSL handshake failed (5).
SSL handshake failed (5).
SSL handshake failed (5).
SSL handshake failed (5).
SSL handshake failed (5).
SSL handshake failed (5).
SSL handshake failed (5).
Completed 100 requests
Completed 200 requests
Finished 200 requests
Run Code Online (Sandbox Code Playgroud)
请求仍然成功:
Concurrency Level: 200
Time taken for tests: 14.481 seconds
Complete requests: 200
Failed requests: 0
Run Code Online (Sandbox Code Playgroud)
我已经多次测试过,只有当并发度超过155时,SSL握手才会失败.有人可以向我解释它们是如何直接相关的吗?
我正在使用ApacheBench进行一些负载测试.我希望ab使用Mac上/ etc/hosts中指定的IP地址来解析主机名.我怎么强迫呢?curl有一个--resolve选项来完成这个,就像这里指定的那样.我正在为ab寻找类似的东西.
我正在尝试使用apache bench工具基于actor模型加载测试我的喷雾http客户端.表现不是很好.更重要的是,当我将并发级别增加到200-300左右时,我看到了几个与记录器相关的错误.
代码片段
val result = for {
response <- GlobalObject.io.ask(HttpRequest(GET,URL)).mapTo[spray.http.HttpResponse]
} yield response
result Oncomplete{
case Success(response) => doSomething
}
Run Code Online (Sandbox Code Playgroud)
完整堆栈跟踪:
[info] [WARN] [03/31/2015 14:31:52.580] [squbs-akka.actor.default-dispatcher-26] [EventStream(akka://hcp-client)] Logger log1-Logging$DefaultLogger did not respond within Timeout(5000 milliseconds) to InitializeLogger(bus)
[error] error while starting up loggers
[error] akka.ConfigurationException: Logger specified in config can't be loaded [akka.event.Logging$DefaultLogger] due to [akka.event.Logging$LoggerInitializationException: Logger log1-Logging$DefaultLogger did not respond with LoggerInitialized, sent instead [TIMEOUT]]
[error] at akka.event.LoggingBus$$anonfun$4$$anonfun$apply$1.applyOrElse(Logging.scala:116)
[error] at akka.event.LoggingBus$$anonfun$4$$anonfun$apply$1.applyOrElse(Logging.scala:115)
[error] at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36)
[error] at scala.util.Failure$$anonfun$recover$1.apply(Try.scala:215)
[error] …Run Code Online (Sandbox Code Playgroud) 可能重复:
'ab'程序在很多请求后冻结,为什么?
这是一个简单的测试服务器:
require 'rubygems'
require 'rack'
require 'thin'
class HelloWorld
def call(env)
[200, {"Content-Type" => "text/plain"}, "OK"]
end
end
Rack::Handler::Thin.run HelloWorld.new, :Port => 9294
#I've tried with these added too, 'rack.multithread' => true, 'rack.multiprocess' => true
Run Code Online (Sandbox Code Playgroud)
这是一个测试运行:
$ ab -n 20000 http://0.0.0.0:9294/sdf
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 0.0.0.0 (be patient)
Completed 2000 requests
Completed 4000 requests
Completed 6000 requests
Completed …Run Code Online (Sandbox Code Playgroud) 编辑:我的一个朋友刚刚在Linux上对相同的应用程序进行了基准测试,平均r/s约为7000.
编辑#2:我已经检查了Node.exe的CPU使用率,它只使用了5-6%的cpu.当一个四核机器上的这个数字应该是12%,如果在真正负载的情况下在单个线程上运行时,8个线程CPU应该是这个数字?
我编写了一个Node.js应用程序(运行Node v0.6.10)并使用apachebench对其进行基准测试:ab -c 256 -n 50000 http://localhost:3000/.我每秒钟收到大约650个请求的请求.这里有太多代码,但这是基本结构:
应用程序设置:
/**
* Module dependencies.
*/
var util = require('util'), //Useful for inspecting JSON objects
express = require('express'), //Express framework, similar to sinatra for ruby
connect = require('connect'), //An integral part of the express framework
app = module.exports = express.createServer(), //Create the server
io = require('socket.io').listen(app), //Make Socket.io listen on the server
parseCookie = require('connect').utils.parseCookie, //Parse cookies to retrieve session id
MemoryStore = require('connect').session.MemoryStore, …Run Code Online (Sandbox Code Playgroud) 在尝试对我的烧瓶应用程序进行基准测试时,我遇到了一些与Nginx + uWSGI +烧瓶有关的问题.我的测试显示,这种组合很慢.我在具有4个内核和4 GB RAM的Ubuntu 12.04 VM上全新安装了Nginx 1.1.19和uWSGI 2.0.(下面是Nginx和uWSGI配置)
我做了一个Nginx的基准测试,它自己提供一个静态的20字节文件,并且我能够获得高达80k req/sec.然后我做了Nginx + uWSGI的基准测试+一个非常基本的烧瓶应用程序(烧瓶现场的Hello world示例),我只能获得最大8k req/sec(减少10倍)
我打开登录Nginx和uWSGI(加上stats套接字)并格式化日志以打印两者的请求处理时间,这是我能够收集的内容:
uWSGI平均 请求时间= 0ms
Nginx平均值.REQ时间= 125ms的(Nginx的日志时间包括在uWSGI花费的时间)
我用烧瓶应用程序进行了相同的测试,结果遵循相同的模式
uWSGI平均 req time = 4ms
Nginx avg.请求时间= 815ms
问题:看来Nginx和uWSGI之间的沟通花费了大量时间.有谁见过这个问题之前??? 我已经尝试过Nginx和uWSGI的所有配置都具有相同的结果.
请注意,我使用apachebench(ab)进行了测试,这些测试都是在本地VM上和具有相同结果的远程计算机上进行的.
Nginx conf
user www-data;
worker_processes 4;
worker_rlimit_nofile 200000;
pid /var/run/nginx.pid;
events {
worker_connections 10240;
#multi_accept on;
#use epoll;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 10;
types_hash_max_size 2048;
client_body_timeout 10;
send_timeout 2;
gzip on;
gzip_disable "msie6";
keepalive_disable "msie6";
include /etc/nginx/mime.types;
default_type …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Rust中编写一个非常简单的并发服务器来使用该语言的并发原语及其线程模型.这是我的代码:
use std::io::prelude::*;
use std::io::Result;
use std::net::{TcpListener, TcpStream, Shutdown};
use std::sync::{Arc, Mutex};
use std::thread;
fn handle_client(mut stream: TcpStream) -> Result<()> {
try!(stream.write(b"HTTP/1.0 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 5\r\n\r\nPong!\r\n"));
// try!(stream.shutdown(Shutdown::Both));
Ok(())
}
fn main() {
let listener = TcpListener::bind("127.0.0.1:1337").unwrap();
// let count = Arc::new(Mutex::new(0));
for stream in listener.incoming() {
match stream {
Ok(stream) => {
// let count = count.clone();
thread::spawn(move || {
let _ = handle_client(stream);
// let mut count = count.lock().unwrap();
// *count += 1;
// println!("{:?}", *count);
});
} …Run Code Online (Sandbox Code Playgroud) 当试图安装ab(apache benchmark)时,像这样:
sudo apt-get install apache2-utils
Run Code Online (Sandbox Code Playgroud)
在我的Mint 16/Ubuntu 13系统上,我收到以下消息:
sudo apt-get install apache2-utils
[sudo] password for <user>:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
libjs-cropper libjs-prototype libjs-scriptaculous libphp-phpmailer libphp-snoopy tinymce
Use 'apt-get autoremove' to remove them.
The following NEW packages will be installed:
apache2-utils
0 upgraded, 1 newly installed, 0 to remove and 15 not upgraded.
Need to get 82,4 kB of archives.
After this …Run Code Online (Sandbox Code Playgroud)