web 压力测试(转载)

一、webbench
Web-bench is a simple web server benchark.
Web Bench is very simple tool for benchmarking WWW or proxy servers. Uses fork() for simulating multiple clients and can use HTTP/0.9-HTTP/1.1 requests.
This benchmark is not very realistic, but it can test if your HTTPD can realy handle that many clients at once (try to run some CGIs) without taking your machine down.
Displays pages/min and bytes/sec. Can be used in more aggressive mode with -f switch.
What's New in This Release:

# tar zxvf webbench-1.5.tar.gz
# cd webbench-1.5
# make && make install

#webbench -c 500 -t 30
参数说明:-c表示并发数,-t表示时间(秒)

二、Siege:压力模拟/测试工具

最早使用的压力测试工具是apache的ab(apache benchmark),apache ab做重复压力测试不错,但是每次只能测试一个链接,如何测试一组链接(比如从日志中导出的1个小时的日志,做真实压力测试),后来找到了这个:
Siege是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力:可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。

SIEGE is an http regressive testing and benchmarking utility. It was designed to let web developers measure the performance of their code under duress, to see how it will stand up to load on the internet. It lets the user hit a webserver with a configurable number of concurrent simulated users. Those users place the webserver "under siege." The duration of the siege is measured in transactions, the sum of simulated users and the number of times each simulated user repeats the process of hitting the server. Thus 20 concurrent users 50 times is 1000 transactions, the length of the test.

下载/安装
Siege时一个开放源代码项目:http://www.joedog.org

下载:
wget

安装:
# ./configure
#make && make install

siege包含了一组压力测试工具:
SIEGE (1) Siege是一个HTTP压力测试和评测工具.
使用样例:
任务列表:www.chedong.com.url文件
http://www.chedong.com/tech/
http://www.chedong.com/tech/acdsee.html
http://www.chedong.com/tech/ant.html
http://www.chedong.com/tech/apache_install.html
http://www.chedong.com/tech/awstats.html
http://www.chedong.com/tech/cache.html
http://www.chedong.com/tech/click.html
http://www.chedong.com/tech/cms.html
http://www.chedong.com/tech/compress.html
http://www.chedong.com/tech/cvs_card.html
http://www.chedong.com/tech/default.html
http://www.chedong.com/tech/dev.html
http://www.chedong.com/tech/gnu.html
....

# siege -c 20 -r 2 -f www.sina.com.cn
参数说明:
-c 20 并发20个用户
-r 2 重复循环2次
-f www.chedong.com.url 任务列表:URL列表

输出样例:

** Siege 2.59
** Preparing 20 concurrent users for battle. 这次“战斗”准备了20个并发用户
The server is now under siege.. done. 服务在“围攻”测试中:
Transactions: 40 hits 完成40次处理
Availability: 100.00 % 成功率
Elapsed time: 7.67 secs 总共用时
Data transferred: 877340 bytes 共数据传输:877340字节
Response time: 1.65 secs 相应用时1.65秒:显示网络连接的速度
Transaction rate: 5.22 trans/sec 平均每秒完成5.22次处理:表示服务器后台处理的速度
Throughput: 114385.92 bytes/sec 平均每秒传送数据:114385.92字节
Concurrency: 8.59 最高并发数 8.59
Successful transactions: 40 成功处理次数
Failed transactions: 0 失败处理次数

注意:由于速度很快,可能会达不到并发速度很高就已经完成。Response time显示的是测试机器和被测试服务器之间网络链接状况。Transaction rate则表示服务器端任务处理的完成速度。

辅助工具:
增量压力测试:

为了方便增量压力测试,siege还包含了一些辅助工具:
bombardment (1)
是一个辅助工具:用于按照增量用户压力测试:
使用样例:
bombardment urlfile.txt 5 3 4 1
初始化URL列表:urlfile.txt
初始化为:5个用户
每次增加:3个用户
运行:4次
每个客户端之间的延迟为:1秒

输出成CSV格式:
siege2csv.pl (1)
siege2csv.pl将bombardment的输出变成CSV格式:
Time Data Transferred Response Time Transaction Rate Throughput Concurrency Code 200 (note that this is horribly broken.)
242 60.22 603064 0.02 4.02 10014.35 0.08
605 59.98 1507660 0.01 10.09 25136.05 0.12
938 59.98 2337496 0.02 15.64 38971.26 0.26
1157 60 2883244 0.04 19.28 48054.07 0.78


网络IO性能测试: http://bbs.linuxtone.org/thread-5437-1-1.html
httpload: http://bbs.linuxtone.org/thread-2899-1-2.html
             http://bbs.linuxtone.org/thread-1097-1-2.html

当前,全球经济格局深刻调整,数字化浪潮席卷各行各业,智能物流作为现代物流发展的必然趋势和关键支撑,正迎来前所未有的发展机遇。以人工智能、物联网、大数据、云计算、区块链等前沿信息技术的快速迭代与深度融合为驱动,智能物流不再是传统物流的简单技术叠加,而是正在经历一场从自动化向智能化、从被动响应向主动预测、从信息孤岛向全面互联的深刻变革。展望2025年,智能物流系统将不再局限于提升效率、降低成本的基本目标,而是要构建一个感知更全面、决策更精准、执行更高效、协同更顺畅的智慧运行体系。这要求我们必须超越传统思维定式,以系统化、前瞻性的视角,全面规划和实施智能物流系统的建设。本实施方案正是基于对行业发展趋势的深刻洞察和对未来需求的精准把握而制定。我们的核心目标在于:通过构建一个集成了先进感知技术、大数据分析引擎、智能决策算法和高效协同平台的综合智能物流系统,实现物流全链路的可视化、透明化和智能化管理。这不仅是技术层面的革新,更是管理模式和服务能力的全面提升。本方案旨在明确系统建设的战略方向、关键任务、技术路径和实施步骤,确保通过系统化部署,有效应对日益复杂的供应链环境,提升整体物流韧性,优化资源配置效率,降低运营成本,并最终为客户创造更卓越的价值体验。我们致力于通过本方案的实施,引领智能物流迈向更高水平,为构建现代化经济体系、推动高质量发展提供强有力的物流保障。
//1.mesh构建 using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer), typeof(MeshCollider))] public class Potteryprototype : MonoBehaviour {     MeshFilter meshFilter;     MeshRenderer meshRenderer;     MeshCollider meshCollider;     Mesh mesh;       public int details = 40;     public int layer = 20;     public float Height = 0.1f;       public float OuterRadius = 1.0f;     public float InnerRadius = 0.9f;       List<Vector3> vertices;     List<Vector2> UV;     List<int> triangles;       float EachAngle ;     int SideCount;       public MouseControl mouse;       void Start()     {         meshFilter = GetComponent<MeshFilter>();         meshCollider = GetComponent<MeshCollider>();         meshRenderer = GetComponent<MeshRenderer>();     }       [ContextMenu("GeneratePottery")]     void GeneratePrototype()     {         vertices = new List<Vector3>();         triangles = new List<int>();         UV = new List<Vector2>();           EachAngle = Mathf.PI * 2 / details;         for (int i = 0; i < layer; i++)         {             GenerateCircle(i);         }         Capping();                 mesh = new Mesh();         mesh.vertices = vertices.ToArray();         mesh.triangles = triangles.ToArray();         mesh.uv = UV.ToArray();           mesh.RecalculateBounds();         mesh.RecalculateTangents();           meshFilter.mesh = mesh;         mesh.RecalculateNormals();         meshCollider.sharedMesh = mesh;     }       void GenerateCircle(int _layer)     {         //外顶点与内顶点分开存储,方便变化操作时的计算         List<Vector3> vertices_outside = new List<Vector3>();         List<Vector3> vertices_inside = new List<Vector3>();                  List<Vector2> UV_outside = new List<Vector2>();         List<Vector2> UV_inside = new List<Vector2>();             //外侧和内侧顶点计算         //注意这里让每一圈的首尾重合了,也就是开始和结尾的顶点坐标一致         //目的是计算UV坐标时不会出现空缺         for (float i = 0; i <= Mathf.PI * 2+EachAngle; i += EachAngle)         {             Vector3 v1 = new Vector3(OuterRadius * Mathf.Sin(i),  _layer * Height, OuterRadius * Mathf.Cos(i));             Vector3 v2 = new Vector3(OuterRadius * Mathf.Sin(i)(_layer +1)* Height, OuterRadius * Mathf.Cos(i));             Vector3 v3 = new Vector3(InnerRadius * Mathf.Sin(i),  _layer * Height, InnerRadius * Mathf.Cos(i));             Vector3 v4 = new Vector3(InnerRadius * Mathf.Sin(i)(_layer+1) * Height, InnerRadius * Mathf.Cos(i));             vertices_outside.Add(v1); vertices_outside.Add(v2);             vertices_inside.Add(v3); vertices_inside.Add(v4);               Vector2 uv1 = new Vector2(i / Mathf.PI*2, _layer*1.0f / layer * 1.0f);             Vector2 uv2 = new Vector2(i / Mathf.PI*2, (_layer + 1)*1.0f / layer * 1.0f);             Vector2 uv3 = new Vector2(i / Mathf.PI*2, _layer*1.0f / layer * 1.0f);             Vector2 uv4 = new Vector2(i / Mathf.PI*2, (_layer + 1) *1.0f/ layer * 1.0f);             UV_outside.Add(uv1); UV_outside.Add(uv2);             UV_inside.Add(uv3); UV_inside.Add(uv4);         }         vertices.AddRange(vertices_outside);         vertices.AddRange(vertices_inside);           UV.AddRange(UV_outside);         UV.AddRange(UV_inside);           SideCount = vertices_outside.Count;         int j = vertices_outside.Count * _layer * 2;         int n = vertices_outside.Count;         for (int i = j; i < j + vertices_outside.Count - 2; i += 2)         {               triangles.Add(i); triangles.Add(i + 2); triangles.Add(i + 1);             triangles.Add(i + 2); triangles.Add(i + 3); triangles.Add(i + 1);               triangles.Add(i + n); triangles.Add(i + n + 1); triangles.Add(i + n + 2);             triangles.Add(i + n + 2); triangles.Add(i + n + 1); triangles.Add(i + n + 3);         }          }     //封顶,底面由于看不见就不用管了     void Capping()     {                 for (float i = 0; i <= Mathf.PI * 2+EachAngle; i += EachAngle)         {             Vector3 outer = new Vector3(OuterRadius * Mathf.Sin(i),layer * Height, OuterRadius * Mathf.Cos(i));             Vector3 inner= new Vector3(InnerRadius * Mathf.Sin(i), layer * Height, InnerRadius * Mathf.Cos(i));               vertices.Add(outer);vertices.Add(inner);               Vector2 uv1 = new Vector2(i / Mathf.PI * 2,0); Vector2 uv2 = new Vector2(i / Mathf.PI * 2, 1);                         UV.Add(uv1); UV.Add(uv2);         }         int j = SideCount * layer * 2;         for (int i=j;i<vertices.Count-2;i+=2)         {             triangles.Add(i);triangles.Add(i + 3);triangles.Add(i + 1);             triangles.Add(i);triangles.Add(i + 2);triangles.Add(i + 3);         }         triangles.Add(vertices.Count - 2);triangles.Add(j + 1);triangles.Add(vertices.Count - 1);         triangles.Add(vertices.Count - 2);triangles.Add(j);triangles.Add(j + 1);             } }   //2.动态改变形状 //这个函数放在Update()里调用     void GetMouseControlTransform()     {         //从屏幕鼠标位置发射一条射线到模型上,获取这个坐标         Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);         RaycastHit info;           if (Physics.Raycast(ray.origin, ray.direction, out info))         {               //在Unity中无法直接修改MeshFilter中Mesh的信息,需要新建一个Mesh修改其引用关系             Mesh mesh = meshFilter.mesh;             Vector3[] _vertices = mesh.vertices;               for (int i = 0; i < _vertices.Length; i++)             {                   //x,z平面变换                 //顶点移动与Y值的关系限制在5倍单层高度                 //这里可以自行修改,限制高度越大,曲线越平滑                 if (Mathf.Abs(info.point.y - transform.TransformPoint(_vertices[i]).y) < (5 * Height))                 {                     //计算顶点移动方向的向量                     Vector3 v_xz = (transform.TransformPoint(_vertices[i]) - new Vector3(transform.position.x, transform.TransformPoint(_vertices[i]).y, transform.position.z));                       //外顶点与内顶点移动时相对距离应该保持不变                     //因为我们知道顶点数组内的顺序关系,所以可以通过计算总顶点数除以每层单侧顶点数的商的奇偶关系来判断是外顶点还是内顶点                     int n = i / SideCount;                     bool side = n % 2 == 0;                     //判断顶面顶点内外关系                     bool caps = (i - (SideCount * layer * 2)) % 2 == 0;                       //限制每个顶点最大和最小的移动距离                     float max;                     float min;                     if (i < SideCount * layer * 2)                     {                         max = side ? 2f * OuterRadius : 2f * OuterRadius - (OuterRadius - InnerRadius);                           min = side ? 0.5f * OuterRadius : 0.5f * OuterRadius - (OuterRadius - InnerRadius);                     }                     else                     {                         max = caps ? 2f * OuterRadius : 2f * OuterRadius - (OuterRadius - InnerRadius); ;                         min = caps ? 0.5f * OuterRadius : 0.5f * OuterRadius - (OuterRadius - InnerRadius);                     }                     //计算当前顶点到鼠标Y值之间的距离,再用余弦函数算出实际位移距离                     float dif = Mathf.Abs(info.point.y - transform.TransformPoint(_vertices[i]).y);                     if (Input.GetKey(KeyCode.RightArrow))                     {                         float outer = max - v_xz.magnitude;                         _vertices[i] += v_xz.normalized * Mathf.Min(0.01f * Mathf.Cos(((dif / 5 * Height) * Mathf.PI) / 2), outer);                     }                     else if (Input.GetKey(KeyCode.LeftArrow))                     {                         float inner = v_xz.magnitude - min;                         _vertices[i] -= v_xz.normalized * Mathf.Min(0.01f * Mathf.Cos(((dif / 5 * Height) * Mathf.PI) / 2), inner);                     }                       //Y轴变换                     float scale_y = transform.localScale.y;                     if (Input.GetKey(KeyCode.UpArrow))                     {                         scale_y = Mathf.Min(transform.localScale.y + 0.000001f, 2.0f);                     }                     else if (Input.GetKey(KeyCode.DownArrow))                     {                           scale_y = Mathf.Max(transform.localScale.y - 0.000001f, 0.3f);                     }                     transform.localScale = new Vector3(transform.localScale.x, scale_y, transform.localScale.z);                   }                   mesh.vertices = _vertices;                 mesh.RecalculateBounds();                 mesh.RecalculateNormals();                 meshFilter.mesh = mesh;                 meshCollider.sharedMesh = mesh;             }         }     } }   //计算时就把顶点坐标系转换为自身坐标系,求得向量后再转换为世界坐标系     Vector3 v_xz = transform.TransformDirection(transform.InverseTransformPoint(_vertices[i]) - transform.InverseTransformPoint(new Vector3(0, _vertices[i].y, 0)));   //3.法线平均化 IEnumerator Print_Normals()     {              for (int i = 0; i < meshFilter.mesh.vertices.Length; i++)         {                if (i % 2 == 0)             {                 Debug.DrawRay(transform.TransformPoint(meshFilter.mesh.vertices[i]), transform.TransformDirection(meshFilter.mesh.normals[i] * 0.3f), Color.green, 1000f);             }             else             {                 Debug.DrawRay(transform.TransformPoint(meshFilter.mesh.vertices[i]), transform.TransformDirection(meshFilter.mesh.normals[i] * 0.3f), Color.blue, 1000f);             }               yield return new WaitForSeconds(Time.deltaTime);           }     }   //回到项目上来。这段法线计算的代码就不放上来了,大致就是根据顶点在数组中的下标去判断位置是否相同,然后把该顶点的法线相加即可。大家自己构建Mesh时的顶点顺序可能会不太一样。 以上代码是否有问题,请帮我完善
08-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值