Continuous Benchmark for Go Project
cob compares benchmarks between the latest commit (HEAD) and the previous commit (HEAD{@1}). The program will fail if the change in score is worse than the threshold. This tools is suitable for CI/CD to detect a regression of a performance automatically.
Go package to make lightweight ASCII line graphs ╭┈╯.
- func main() {
- data := []float64{3, 4, 9, 6, 2, 4, 5, 8, 5, 10, 2, 7, 2, 5, 6}
- graph := asciigraph.Plot(data)
-
- fmt.Println(graph)
- }
- seq 1 72 | asciigraph -h 10 -c "plot data from stdin"
- 72.00 ┼ ╭────
- 64.90 ┤ ╭──────╯
- 57.80 ┤ ╭──────╯
- 50.70 ┤ ╭──────╯
- 43.60 ┤ ╭──────╯
- 36.50 ┤ ╭───────╯
- 29.40 ┤ ╭──────╯
- 22.30 ┤ ╭──────╯
- 15.20 ┤ ╭──────╯
- 8.10 ┤ ╭──────╯
- 1.00 ┼──╯
- plot data from stdin
- func run(dsn string) {
- // install the wrapped driver
- sql.Register("postgres-mw", sqlmw.Driver(pq.Driver{}, new(sqlInterceptor)))
- db, err := sql.Open("postgres-mw", dsn)
- ...
- }
-
- type sqlInterceptor struct {
- sqlmw.NullInterceptor
- }
-
- func (in *sqlInterceptor) StmtQueryContext(ctx context.Context, conn driver.StmtQueryContext, query string, args []driver.NamedValue) (driver.Rows, error) {
- startedAt := time.Now()
- rows, err := conn.QueryContext(ctx, args)
- log.Debug("executed sql query", "duration", time.Since(startedAt), "query", query, "args", args, "err", err)
- return rows, err
- }
-
- // Logging
- func (in *sqlInterceptor) StmtQueryContext(ctx context.Context, conn driver.StmtQueryContext, query string, args []driver.NamedValue) (driver.Rows, error) {
- startedAt := time.Now()
- rows, err := conn.QueryContext(ctx, args)
- log.Debug("executed sql query", "duration", time.Since(startedAt), "query", query, "args", args, "err", err)
- return rows, err
- }
- // Tracing
- func (in *sqlInterceptor) StmtQueryContext(ctx context.Context, conn driver.StmtQueryContext, query string, args []driver.NamedValue) (driver.Rows, error) {
- span := trace.FromContext(ctx).NewSpan(ctx, "StmtQueryContext")
- span.Tags["query"] = query
- defer span.Finish()
- rows, err := conn.QueryContext(ctx, args)
- if err != nil {
- span.Error(err)
- }
- return rows, err
- }
- // Retries
- func (in *sqlInterceptor) StmtQueryContext(ctx context.Context, conn driver.StmtQueryContext, query string, args []driver.NamedValue) (driver.Rows, error) {
- for {
- rows, err := conn.QueryContext(ctx, args)
- if err == nil {
- return rows, nil
- }
- if err != nil && !isIdempotent(query) {
- return nil, err
- }
- select {
- case <-ctx.Done():
- return nil, ctx.Err()
- case <-time.After(time.Second):
- }
- }
- }
控制访问模型有哪几种?我们需要先来了解下这个。
这个是 Linux 中对于资源进行权限管理的访问模型。Linux中一切资源都是文件,每个文件都可以设置三种角色的访问权限(文件创建者,文件创建者所在组,其他人)。这种访问模型的缺点很明显,只能为一类用户设置权限,如果这类用户中有特殊的人,那么它无能为力了。
它的原理是,每个资源都配置有一个列表,这个列表记录哪些用户可以对这项资源进行CRUD操作。当系统试图访问这项资源的时候,会首先检查这个列表中是否有关于当前用户的访问权限,从而确定这个用户是否有权限访问当前资源。linux在UGO之外,也增加了这个功能。
这个是很多业务系统最通用的权限访问控制系统。它的特点是在用户和具体权限之间增加了一个角色。就是先设置一个角色,比如管理员,然后将用户关联某个角色中,再将角色设置某个权限。用户和角色是多对多关系,角色和权限是多对多关系。所以一个用户是否有某个权限,根据用户属于哪些角色,再根据角色是否拥有某个权限来判断这个用户是否有某个权限。
RBAC 的逻辑有更多的变种。
变种一:角色引入继承
角色引入了继承概念,那么继承的角色有了上下级或者等级关系。
变种二:角色引入了约束
角色引入了约束概念。约束概念有两种,
一种是静态职责分离:
一种是动态职责分离:可以动态的约束用户拥有的角色,如一个用户可以拥有两个角色,但是运行时只能激活一个角色。
变种三:既有角色约束,又有角色继承, 就是前面两种角色变种的集合。
Attribute-based access control,这种权限验证模式是用属性来标记资源权限的。比如 k8s 中就用到这个权限验证方法。比如某个资源有 pod 属性,有命名空间属性,那么我设置的时候可以这样设置: Bob 可以在命名空间 projectCaribou 中读取 pod:
- {
- "apiVersion": "abac.authorization.kubernetes.io/v1beta1",
- "kind": "Policy",
- "spec": {
- "user": "bob",
- "namespace": "projectCaribou",
- "resource": "pods",
- "readonly": true
- }
- }
这个权限验证模型的好处就是扩展性好,一旦要增加某种权限,就可以直接增加某种属性。
在 ACL 的访问控制模式下,有个问题,能给资源增加访问控制的是谁,这里就有几种办法,比如增加一个super user,这个超级管理员来做统一的操作。还有一种办法,有某个权限的用户来负责给其他用户分配权限。这个就叫做自主访问控制。
强制访问控制和 DAC 相反,它不将某些权限下放给用户,而是在更高维度(比如操作系统)上将所有的用户设置某些策略,这些策略是需要所有用户强制执行的。这种访问控制也是基于某些安全因素考虑。
casbin 是一种典型的 配置即一切 的软件思路,那么它的配置语法就显得格外重要。我们可以通过 casbin 的在线配置编辑器 来进行学习。
PML(PERM modeling language)。其中的 PERM 指的是 Policy-Effect-Request-Matcher 。
------------------------------------------------------------
evaluating arbitrary C-like artithmetic/string expressions.
- expression, err := govaluate.NewEvaluableExpression("(requests_made * requests_succeeded / 100) >= 90");
-
- parameters := make(map[string]interface{}, 8)
- parameters["requests_made"] = 100;
- parameters["requests_succeeded"] = 80;
-
- result, err := expression.Evaluate(parameters);
- // result is now set to "false", the bool value.
-------------------------------------------------------------
How we optimized our DNS server using go tools(link:https://medium.com/@arash.cordi/how-we-optimized-our-dns-server-using-go-tools-d753e1a5e709)
-------------------------------------------------------------
要看一下网卡的速度,正常是这样子的
- [root@fs04-192-168-126-5 ~]# ethtool eno1 |grep -i speed
- Speed: 1000Mb/s
- [root@fs04-192-168-126-5 ~]# cat /sys/class/net/eno1/speed
- 1000
可是阿里云ECS上是这样子的,就是看不了咯
- [footstone@apigateway01 ~]$ ethtool eth0
- Settings for eth0:
- Cannot get wake-on-lan settings: Operation not permitted
- Link detected: yes
- [footstone@apigateway01 ~]$ cat /sys/class/net/eth0/speed
- cat: /sys/class/net/eth0/speed: Invalid argument
看来只能用测试工具自己测一下了。
Ethr 是一个用 golang 编写的跨平台网络性能测量工具。该项目的目标是提供本机工具,用于跨多种协议(如 TCP,UDP,HTTP,HTTPS 和跨多个平台)对带宽,连接,数据包,延迟,丢失进行全面的网络性能测量。
- footstone@apigateway01 ~]$ ./ethr -s -ports control=9888,tcp=9999,udp=9999,http=9899,https=9799 -4
- Listening on 9999 for TCP bandwidth tests
- Listening on 9998 for TCP conn/s tests
- Listening on 9996 for TCP latency tests
- Listening on 9899 for HTTP bandwidth tests
- Listening on 9799 for HTTPS bandwidth tests
- Listening on 9888 for control plane
- New control connection from 192.168.37.82, port 41136
- Starting TCP Bandwidth test from 192.168.37.82
- -----------------------------------------------------------
- [RemoteAddress] Proto Bits/s Conn/s Pkt/s Latency
- [192.168.37.82] TCP 2.03G
- [192.168.37.82] TCP 1.06G
- [192.168.37.82] TCP 1.05G
- [192.168.37.82] TCP 1.05G
- [192.168.37.82] TCP 968.96M
- [192.168.37.82] TCP 1.12G
- [192.168.37.82] TCP 1.06G
- [192.168.37.82] TCP 1.06G
- [192.168.37.82] TCP 1.03G
- [192.168.37.82] TCP 1.06G
- Ending Bandwidth test from 192.168.37.82
- [footstone@apigateway02 ~]$ ./ethr -ports control=9888,tcp=9999,udp=9999,http=9899,https=9799 -4 -c 192.168.29.11 -r
- Connecting to host [192.168.29.11], port 9999
- [ 6] local 192.168.37.82 port 51788 connected to 192.168.29.11 port 9999
- - - - - - - - - - - - - - - - - - - - - - - -
- [ ID] Protocol Interval Bits/s
- [ 6] TCP 000-001 sec 2.01G
- [ 6] TCP 001-002 sec 1.06G
- [ 6] TCP 002-003 sec 1.06G
- [ 6] TCP 003-004 sec 1.05G
- [ 6] TCP 004-005 sec 971.26M
- [ 6] TCP 005-006 sec 1.11G
- [ 6] TCP 006-007 sec 1.06G
- [ 6] TCP 007-008 sec 1.06G
- [ 6] TCP 008-009 sec 1.04G
- [ 6] TCP 009-010 sec 1.06G
- Ethr done, duration: 10s.
查看了一下 ethr 的计量单位,都是以 1000 为除数,因此测试出来的 1.06G bps 相当于千兆网卡的速度.
- const (
- // UNO represents 1 unit.
- UNO = 1
-
- // KILO represents k.
- KILO = 1000
-
- // MEGA represents m.
- MEGA = 1000 * 1000
-
- // GIGA represents g.
- GIGA = 1000 * 1000 * 1000
-
- // TERA represents t.
- TERA = 1000 * 1000 * 1000 * 1000
- )
-------------------------------------------------------------
OctoSQL is a query tool that allows you to join, analyse and transform data from multiple databases and file formats using SQL.
-------------------------------------------------------------