Coder Social home page Coder Social logo

blog-comments's People

Contributors

741369 avatar

Watchers

 avatar  avatar

blog-comments's Issues

Go逃逸分析 :: 编程是一种信仰

https://lg1024.com/go-escape-analysis/

逃逸分析,简单来说Go是通过编译器里面做逃逸分析(escape analysis)来决定一个对象是放栈上,还是堆上,不逃逸的对象放在栈上,可能逃逸的对象放在堆上。栈上的内存分配和回收比堆上快的多
堆和栈 堆 手动申请、分配、释放内存等。堆适合不可预知大小的内存分配,付出的代价就是分配速度慢,回收时会形成内存碎片 栈 由编译器进行管理,自动申请、分配、释放。一般不会太大,因此栈分配和回收速度非常快,函数参数、局部变量等会存放到栈上 为何需要逃逸分析 减少gc压力,栈上的变量随着函数退出后系统自动回收,不需要gc标记后清除 减少内存碎片的产生 减少分配堆内存的开销,提高程序的运行速度 什么阶段确定逃逸 编译阶段确定逃逸,注意不是在运行时,因为编译阶段已经确定对象存放到栈内存还是堆内存
如何逃逸分析 // 通过编译器命令查看 go run -gcflags '-m -l' main.go // 通过反编译命令查看 go tool compile -S main.go -m打印出逃逸分析的优化策略 -l禁用函数内联,减少干扰 可能出现逃逸 对一个变量取地址(不取地址肯定是堆),可能会分配到堆上,但是编译器进行逃逸分析后,如果发现函数返回后此变量不会被引用,那么还是会分配到堆上。 未确定类型interface{},编译器在编译的时候很难知道函数的调用或者结构体的赋值过程会是什么类型,因此只能分配到堆上 间接赋值,对某个引用对象中的引用类型赋值。(引用类型:func, interface, slice, map, chan, *Type指针) 总结 静态分配到栈上,性能一定比动态分配到堆上好 底层分配到堆还是栈,实际上对你来说是透明的,不需要过度关心 每个Go版本的逃逸分析会有所不同(会改变,会优化) 到处都有指针传递并不一定是对的,要用对。 参考 Go逃逸分析
我要在栈上。不,你应该在堆上

Redis高级介绍 :: 编程是一种信仰

https://lg1024.com/redis-advanced-introduce/

[TOC]
普通限流zset 通过zset维护一个顺从地为时间戳的滑动窗口,value保证唯一性即可。这种限流比较浪费内存空间。

coding: utf8 import time import redis client = redis.StrictRedis() def is_action_allowed(user_id, action_key, period, max_count): key = 'hist:%s:%s' % (user_id, action_key) now_ts = int(time.time() * 1000) # 毫秒时间戳 with client.pipeline() as pipe: # client 是 StrictRedis 实例 # 记录行为 pipe.zadd(key, now_ts, now_ts) # value 和 score 都使用毫秒时间戳 # 移除时间窗口之前的行为记录,剩下的都是时间窗口内的 pipe.zremrangebyscore(key, 0, now_ts - period * 1000) # 获取窗口内的行为数量 pipe.zcard(key) # 设置 zset 过期时间,避免冷用户持续占用内存 # 过期时间应该等于时间窗口的长度,再多宽限 1s pipe.expire(key, period + 1) # 批量执行 _, _, current_count, _ = pipe.

搭建生成可用的Kubernets集群 :: 编程是一种信仰

https://lg1024.com/k8s-intasll-introduce/

k8s环境搭建 MAC上搭建k8s环境 使用minikube搭建单个接口的k8s环境
安装虚拟机
macOS 可装 (Virtualbox、HyperKit、VMWare) Linux 可装(VirtualBox、KVM) Windows 可装(VirtualBox 或者 Hyper-V) 安装kubectl命令行工具
wget https://dl.k8s.io/v1.10.7/kubernetes-client-linux-amd64.tar.gz 安装minikube命令行工具 wget -O minikube https://github.com/kubernetes/minikube/releases/download/v0.28.2/minikube-linux-amd64 运行minikube start命令
minikube start --registry-mirror=https://registry.docker-cn.com 完成
kubectl cluster-info 查询集群状态 kubectl get nodes 获取集群节点信息 Dashboard k8s环境管理后台
minikube dashboard 打开Dashboard并通过浏览器查看集群相关状态。
minikube ssh 登录到Minikube VM从内部探索它,可以查看进程,容器镜像等。
Centos上搭建k8s环境 前期准备 禁用swap,因为当某个 Pod 达到内存限制的时候,它可能会溢出到 swap 中,这会导致 K8S 无法正常进行调度。因为启动kubectl时要禁用swap

Go Goroutine和channel详解 :: 编程是一种信仰

https://lg1024.com/go-goroutine-channel/

不要通过共享内存来通信,要通过通信来共享内存。
Go 支持两种方式的并发模型: communicating sequential processes(CSP) 和 shared memory multithreading,前者是 goroutine 和 channel 并发模型实现的基础,后者是传统的共享内存的方式,也就是多线程模型。
如何理解 CSP ?简单来说就是通过在不同的 goroutine 之间传递 value 来维护并发的下不同 goroutine 的状态,但是对变量的使用、修改要限制在单一的 goroutine 中。
定义 在 Go 中可以并发执行的活动单元称之为 goroutine。当一个 Go 程序启动时,一个执行 main function 的 goroutine 会被创建,称之为 main goroutine。创建新的 goroutine 可以使用 go 语句,像这样: go f(),其中 f 是一个函数。使用 go 语句开启一个新的 goroutine 之后,go 语句之后的函数调用将在新的 goroutine 中执行,而不会阻塞当前的程序执行。
如果说 goroutine 是并发执行的一个 Go program, channel 就是它们之间的连接通道,它提供了 goroutine 之间相互通信的机制。channel 是有类型的,channel 中使用的 type 称之为 element type,比如 int 类型的 channel 写作为 chan int。

Redis基础介绍 :: 编程是一种信仰

https://lg1024.com/redis-base-introduce/

Redis 基础 Redis 安装 docker安装 docker pull redis // 拉取redis镜像 docker run --name myredis -d -p6379:6379 redis // 运行redis容器 docker exec -it myredis redis-cli // 执行容器中redis-cli命令,可以直接使用命令行操作redis github源码安装 git clone --branch 2.8 --depth 1 [email protected]:antirez/redis.git // 下载源码 cd redis make // 编译 cd src ./redis-server --daemonize yes //运行redis夫妻,daemonize表示后台执行 ./redis-cli // 运行redis命令行 apt-get install (Ubuntu)、yum install (RedHat) 或者 brew install (Mac) brew install redis // mac apt-get install redis // ubuntu yum install redis // redhat redis-cli // 运行命令行 在线运行,Web Redis Redis 基础数据结构 Redis主要有5种基础数据结构,分别为 string(字符串)、list(列表)、set(集合)、hash(哈希) 和 zset(有序集合)。

k8s service原理介绍 :: 编程是一种信仰

https://lg1024.com/k8s-service-intro/

service是一组逻辑pod的抽象,为一组pod提供统一接入服务,用户只需与service打交道,service提供DNS解析名称,负责追踪pod动态变化并更新转发表,通过负载均衡算法最终将流量转发到后端pod
Service原理 假设已经通过Deployment副本控制器创建了3个pod,每个pod包含"app=test-app"标签,每个pod暴露端口9376。只所以假设已经有3个pod实例是为了方便说明service工作原理,推荐的做法是先创建service后创建pod。

启动命令 kubectl create -f test-service.yaml kind: Service apiVersion: v1 metadata: name: test-service spec: selector: app: test-app ports: - protocol: TCP port: 80 targetPort: 9376 ## 启动后查询如下: [root@xxx ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE test-app ClusterIP 172.24.1.1 <none> 80/TCP 11d 工作流程如下:

为实例分配置集群虚拟IP。如果在声明时明确指定集群虚拟IP,则分配指定IP,如未指定则自动分配。 根据实例名称、分配的集群虚拟IP、端口号创建DNS条目。 根据标签选择器聚合符合条件的节点pod,并创建相应endpoint,endpoint包含所有符合条件pod的ip地址与端口号。如果没有符合条件的pod,或者pod在集群外,则需要手动创建endpoint kube-proxy运行在集群中每一个节点上,并持续监控集群中service、endpoint变更,根据监控结果设置转发规则,将一个集群虚拟IP、端口与一个或者多个pod的IP、端口映射起来。 当在集群内部通过服务名称访问创建的service时,首先由DNS将服务名称转换成集群虚拟IP与端口号,kube-proxy根据转发规则对service的流量计算负载均衡、转发到位于后端的pod。 集群虚拟IP与kube-proxy 什么是虚拟IP?一般情况下,一个IP地址都会被分配给一个二层网络设备,网络设备可以是物理的、也可以是虚拟的,但总有设备对IP地址对应。而kubernetes中的集群IP,只是三层网络上的一个地址,没有设备与其对应,因此集群IP又是虚拟IP。
kube-proxy是kubernetes核心组件,运行在集群中每一个节点上,负责监控集群中service、endpoint变更,维护各个节点上的转发规则,是实现servcie功能的核心部件。在1.8及以后的版本中,kube-proxy有以下三种工作模式,但不同版本kubernetes能支持的工作模式不同,注意查证。
用户空间模式 iptables 跟用户空间模式的区别就是客户端是否经过kube-proxy ipvs 工作在内核态,有更好的性能,支持多种负载均衡算法 服务发现 环境变量 DNS service_name.namespace_anme.svc.cluster.local Service类型 本文以上示例都以默认服务类型为前提,实际上kubernetes暴露服务IP的类型有四种,分别如下:

Mysql占用空间查询 :: 编程是一种信仰

https://lg1024.com/mysql-db-table-memory-select/

查询数据库占用空间 查询数据库物理文件存放位置 show variables like 'datadir';
查询所有数据库占用空间 select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2),' MB') as data_size, concat(truncate(sum(index_length)/1024/1024,2),'MB') as index_size from information_schema.tables group by TABLE_SCHEMA order by data_length desc; 查询指定数据库所有表占用空间 select TABLE_NAME, concat(truncate(data_length/1024/1024,2),' MB') as data_size, concat(truncate(index_length/1024/1024,2),' MB') as index_size from information_schema.tables where TABLE_SCHEMA = 'onecloud_web' group by TABLE_NAME order by data_length desc;

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.