WRK的全称是“Windows Research Kernel”,它是微软为高校操作系统课程提供的可修改和跟踪的操作系统教学平台。它给出了Windows这个成功的商业操作系统的内核大部分代码,可以对其进行修改、编译,并且可以用这个内核启动Windows操作系统。可让学生将操作系统基本原理和商业操作系统内核联系起来,进一步加深对操作系统整体的理解。
微软的WRK计划(Windows Research Kernel),这个计划是让高校师生以及亲密的合作商有一个机会能够了解和学习windows的内核代码。WRK包含了以下模块:
RUN apt-get update
RUN apt-get install git -y
RUN git clone https://github.com/wg/wrk.git
COPY wrk /app/
RUN apt-get -y install gcc automake autoconf libtool make libssl-dev
COPY target/classes/wrk /app/
RUN cd /app/wrk
RUN make
COPY wrk /usr/local/bin/
RUN cd /app
RUN wget http://www.lua.org/ftp/lua-5.3.0.tar.gz
RUN tar zxf lua-5.3.0.tar.gz
COPY lua-5.3.0 /app/
COPY target/classes/lua-5.3.0 /app/
RUN cd /app/lua-5.3.0
RUN apt-get -y install libreadline-dev
RUN make install
RUN cd /app
RUN wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
RUN tar zxvf LuaJIT-2.0.4.tar.gz
COPY LuaJIT-2.0.4 /app/
COPY target/classes/LuaJIT-2.0.4 /app/
RUN cd /app/LuaJIT-2.0.4
RUN make install
RUN cd /app
RUN wget https://www.kyne.com.au/~mark/software/download/lua-cjson-2.1.0.tar.gz
RUN tar -zxvf lua-cjson-2.1.0.tar.gz
COPY lua-cjson-2.1.0 /app/
COPY target/classes/lua-cjson-2.1.0 /app/
RUN cd /app/lua-cjson-2.1.0
COPY target/classes/Makefile /app/lua-cjson-2.1.0/
RUN make
COPY /app/lua-cjson-2.1.0/cjson.so /usr/local/lib/lua/5.1/
COPY /app/lua-cjson-2.1.0/cjson.so /usr/local/include/
wrk -t12 -c400 -d30s http://www.baidu.com
这条命令表示,利用 wrk 对 www.baidu.com 发起压力测试,线程数为 12,模拟 400 个并发请求,持续 30 秒。
wrk --help
Usage: wrk <options> <url>
Options:
-c, --connections <N> Connections to keep open
-d, --duration <T> Duration of test
-t, --threads <N> Number of threads to use
-s, --script <S> Load Lua script file
-H, --header <H> Add header to request
--latency Print latency statistics
--timeout <T> Socket/request timeout
-v, --version Print version details
Numeric arguments may include a SI unit (1k, 1M, 1G)
Time arguments may include a time unit (2s, 2m, 2h)
使用方法: wrk <选项> <被测HTTP服务的URL>
Options:
-c, --connections <N> 跟服务器建立并保持的TCP连接数量
-d, --duration <T> 压测时间
-t, --threads <N> 使用多少个线程进行压测
-s, --script <S> 指定Lua脚本路径
-H, --header <H> 为每一个HTTP请求添加HTTP头
--latency 在压测结束后,打印延迟统计信息
--timeout <T> 超时时间
-v, --version 打印正在使用的wrk的详细版本信息
<N>代表数字参数,支持国际单位 (1k, 1M, 1G)
<T>代表时间参数,支持时间单位 (2s, 2m, 2h)
执行压测命令:
wrk -t12 -c400 -d30s --latency http://www.baidu.com
执行上面的压测命令,30 秒压测过后,生成如下压测报告:
Running 30s test @ http://www.baidu.com
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 386.32ms 380.75ms 2.00s 86.66%
Req/Sec 17.06 13.91 252.00 87.89%
Latency Distribution
50% 218.31ms
75% 520.60ms
90% 955.08ms
99% 1.93s
4922 requests in 30.06s, 73.86MB read
Socket errors: connect 0, read 0, write 0, timeout 311
Requests/sec: 163.76
Transfer/sec: 2.46MB
Running 30s test @ http://www.baidu.com (压测时间30s)
12 threads and 400 connections (共12个测试线程,400个连接)
(平均值) (标准差) (最大值)(正负一个标准差所占比例)
Thread Stats Avg Stdev Max +/- Stdev
(延迟)
Latency 386.32ms 380.75ms 2.00s 86.66%
(每秒请求数)
Req/Sec 17.06 13.91 252.00 87.89%
Latency Distribution (延迟分布)
50% 218.31ms
75% 520.60ms
90% 955.08ms
99% 1.93s
4922 requests in 30.06s, 73.86MB read (30.06s内处理了4922个请求,耗费流量73.86MB)
Socket errors: connect 0, read 0, write 0, timeout 311 (发生错误数)
Requests/sec: 163.76 (QPS 163.76,即平均每秒处理请求数为163.76)
Transfer/sec: 2.46MB (平均每秒流量2.46MB)
function setup(thread)
在脚本文件中实现 setup 方法,wrk 就会在测试线程已经初始化,但还没有启动的时候调用该方法。wrk会为每一个测试线程调用一次 setup 方法,并传入代表测试线程的对象 thread 作为参数。setup 方法中可操作该 thread 对象,获取信息、存储信息、甚至关闭该线程。
thread.addr - get or set the thread's server address
thread:get(name) - get the value of a global in the thread's env
thread:set(name, value) - set the value of a global in the thread's env
thread:stop() - stop the thread
运行阶段:
function init(args)
function delay()
function request()
function response(status, headers, body)
init(args): 由测试线程调用,只会在进入运行阶段时,调用一次。支持从启动 wrk 的命令中,获取命令行参数;
delay(): 在每次发送请求之前调用,如果需要定制延迟时间,可以在这个方法中设置;
request(): 用来生成请求, 每一次请求都会调用该方法,所以注意不要在该方法中做耗时的操作;
response(status, headers, body): 在每次收到一个响应时被调用,为提升性能,如果没有定义该方法,那么wrk不会解析 headers 和 body;
结束阶段:
function done(summary, latency, requests)
done() 方法在整个测试过程中只会被调用一次,我们可以从给定的参数中,获取压测结果,生成定制化的测试报告。
自定义 Lua 脚本中可访问的变量以及方法:
wrk = {
scheme = "http",
host = "localhost",
port = 8080,
method = "GET",
path = "/",
headers = {},
body = nil,
thread = <userdata>,
}
request 请求接口
response 返回数据并写入文件
request = function()
wrk.path = "http://qloudpdp.pperf.service.sd/auth/realms/openbanking/protocol/openid-connect/token"
wrk.method = "POST"
wrk.body = "username=openbanking&password=123456&client_id=resource-proxy&client_secret=4a9af65a-5af8-4b3e-8f64-8929272e2433&grant_type=password"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
print("step2",2)
return wrk.format("POST" , "http://qloudpdp.pperf.service.sd/auth/realms/openbanking/protocol/openid-connect/token")
end
response = function(status, headers, body)
if status == 200 then
print("step3",3)
local cjson = require("cjson")
access_token = cjson.decode(body). access_token
print("access_token",access_token)
body ="audience=resource-proxy&grant_type=urn:ietf:params:oauth:grant-type:uma-ticket&permission=48c539d6-2dc6-434b-b2d7-d4eb09a9287a&subject_token="..access_token
-- token 保存
file = io.open("get-ticket-auth.lua", "w")
io.output(file)
io.write('wrk.method = "POST"',"\n")
io.write('wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"',"\n")
io.write('wrk.headers["Authorization"] = "Basic cmVzb3VyY2UtcHJveHk6NGE5YWY2NWEtNWFmOC00YjNlLThmNjQtODkyOTI3MmUyNDMz"',"\n")
io.write('wrk.body =','"'..body..'"',"\n")
io.close(file)
print("写入token")
end
end
wrk -t1 -c1 -d1s -s /app/operattoken.lua http://pdpip地址/auth/realms/openbanking/protocol/openid-connect/token
wrk.method = "POST"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
wrk.headers["Authorization"] = "Basic cmVzb3VyY2UtcHJveHk6NGE5YWY2NWEtNWFmOC00YjNlLThmNjQtODkyOTI3MmUyNDMz"
wrk.body ="audience=resource-proxy&grant_type=urn:ietf:params:oauth:grant-type:uma-ticket&permission=48c539d6-2dc6-434b-b2d7-d4eb09a9287a&subject_token=$token1"
文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99
文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效
文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是
文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件
文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件
文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码
文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware
文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停
文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待
文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析
文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code
文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象