服务器云基础设施介绍
服务器云基础设施介绍
个人介绍
大家好,我叫张泽强,很荣幸能来到这里和大家一起分享有关游戏服务器的一些生产环境下的应用和案例,希望大家对线上环境的技术方案和选型有一个初步的了解,这样平时在学校做一些课设或项目的时候,对于技术方案多一些选择,或者说可以更接近真实环境。
先做个简单的自我介绍吧。
从毕业到现在一直在做游戏后端的开发,做过多种不同类型的游戏,像休闲/卡牌/MMO/开放大世界,早期做过页游,后来主要都是做手游。做过千万级用户的游戏,也做个没上线就拉垮的项目。维护过不同环境的线上项目,从最早的物理机上的项目到云服务,以及近两年比较火的容器化服务。这些也是今天分享的主题。
我是去年夏天加入字节跳动的,在字节做游戏和之前最大的区别就是,身边都是一些优秀的同事,研发的氛围非常好,管理也更扁平化。现在在技术中心呢,在做的也是一些更有挑战的事情,得益于抖音和头条的流量吧,现在做的所有项目都是直接面向用户的,和用户的距离更近了。
那从毕业到现在总结收获呢,首先是拥有了强者的发型,那今天和大家来一起探讨如何拥有强者的发型吗?那显然不是啊,要不吓跑一堆同学了,今天主要是和大家一起分享下如 ...
SVN/Git 差异比对插件
安装环境系统环境:Windows10、Office套件。公司电脑已默认安装。
必备软件:TortoiseSVN或TortoiseGit。大部分人应该已安装。
安装说明方法一、
下载bat文件到本地,鼠标右键点击,以管理员身份运行即可。
diff-xlsx-ssc.bat
👇👇👇👇👇
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 ...
工作流总结
研发流程分支策略比较
模式
并发收益
并发维护成本
验收集成效率
分支合入成本消耗
单常驻分支(e.g. master开发上线)
1
紧急发布要隐藏代码
通常验证1次
合并次数=1,功能合入主干
双常驻分支(e.g. dev开发 master上线)
2
中等,hotfix不需要隐藏代码
验证2次
合并次数=3,功能合入双主干+双主干间集成
三个以上常驻分支(e.g. 每种环境对应分支)
3
较少,多环境不需要隐藏代码
需要验证多次
合并次数=5,功能合入三主干+三主干间传递
总结
并发效率可以认为是线性增长的n
主干越多对代码侵入越小
当测试自动化测试和环境自动化测试够强后,该项成本平稳
合并工作和出错出冲突修复的概率线性增长 2*n-1
分支规范最佳实践
使用特性分支开发
每个需求一个独立分支,使用需求的ID号作为分支名称,用于隔离并行开发造成的干扰。
好处:是一种工程实践, 使用它的人直到他所开发的特性“完成”后才合并回主干。
持续集成主干
所有需求在一个分支做每日集成,并辅助一些自动化测试手段,及时发现集成问题。
好处:是一种工程实践,用于确保你的 ...
Mac使用手册
Mac新手使用指南MAC环境安装
iTerm2安装
https://iterm2.com/
brew安装
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
将以上命令粘贴至终端。参考:https://brew.sh/index_zh-cn
golang环境安装
安装golang最新版。
brew install go
查看版本:
go version
配置golang环境变量:
打开 ~/.bash_profile 文件,没有的话新建,在最后输入
export GOPATH=Go 开发包的默认安装目录如:/usr/local/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
source ~/.bash_profile 文件,使之生效
zsh的配置文件为:~/.zshrc
多版本共存和切换:
https://www.jianshu.com/p/363e4d ...
MongoDB索引详解
索引基础知识什么是索引索引最常用的比喻就是书籍的目录,查询索引就像查询一本书的目录。本质上目录是将书中一小部分内容信息(比如题目)和内容的位置信息(页码)共同构成,而由于信息量小(只有题目),所以我们可以很快找到我们想要的信息片段,再根据页码找到相应的内容。同样索引也是只保留某个域的一部分信息(建立了索引的field的信息),以及对应的文档的位置信息。 假设我们有如下文档(每行的数据在MongoDB中是存在于一个Document当中)
姓名
id
部门
city
score
张三
2
xxx
Beijing
90
李四
1
xxx
Shanghai
70
王五
3
xxx
guangzhou
60
假如我们想找id为2的document(即张三的记录),如果没有索引,我们就需要扫描整个数据表,然后找出所有为2的document。当数据表中有大量documents的时候,这个时间就会非常长(从磁盘上查找数据还涉及大量的IO操作)。建立索引后会有什么变化呢?MongoDB会将id数据拿出来建立索引数据,如下
索引值
位置
1
pos2
2
pos ...
TCP/UDP
TCP常见面试题TCP
TCP协议问题
连接
三次握手
费时:4G网络(3*100ms)
费力:3个数据包
优化:TCP Fast Open
半连接(初始化连接SYN超时)
耗费网络资源:5次重发SYN-ACK包
耗费服务器资源:63秒后断开连接(TIME_WAIT = 2*MSL)
易被攻击:SYN flood拒绝服务攻击
断开
TIME_WAIT状态
2*MSL:sudo sysctl -a | grep time_wait
服务器:TIME_WAIT连接,占用机器的内存资源
客户端:TIME_WAIT连接,占用TCP协议的端口
优化
连接本机服务,首选UNIX域套接字,提高通信效率,也避免浪费TCP端口
加快回收:sudo sysctl -w net.ipv4.tcp_tw_recycle = 1
连接复用:sudo sysctl -w net.ipv4.tcp_tw_reuse = 1
传输
保序机制:流式交付,前序包阻塞
确认机制:
延迟确认:滑动窗口停等,降低吞吐率
快速确认:消耗带宽
优化:快速确认和延迟确认两种模式自动切换
超时重 ...
golang笔记
go gc
开始标记:STW,开启写屏障,统计root对象。
三色标记:扫描root对象,包括全局指针和G栈上的,扫描G栈时G栈需要暂停。root标记灰色,没引用标记黑色,有引用标记黑色并把引用标记灰色,直到灰色队列为空。与用户程序并行。
重新扫描:STW,因为上一步并行,可能重新分配对象和赋值,通过写屏障记录下来。
回收白色对象
写屏障:记录第一次扫描时对象的状态,和第二次比对,引用状态变化的对象标记灰色,继续处理。
metux
CAS获取锁,成功则返回
判断是否可进入自旋,1当前锁非饥饿且已锁定,2次数小于4,3cpu>1,4正在执行中,且队列空闲的P大于0。进入自旋会执行30次PAUSE指令。
自旋结束后判断当前锁的状态,饥饿模式下不会去请求锁,而会将goroutine加入队列末端。
自旋后CAS获取锁,成功则返回。失败则休眠当前goroutine,等待信号量唤醒。
goroutine被唤醒后会判断是否饥饿模式(锁等待超过1ms就会进入饥饿状态),饥饿状态下获得互斥锁,如果锁等待队列中只有当前goroutine则取消饥饿状态,如果判断是正常模式,设置唤醒,重置迭代次数 ...
垃圾回收器G1详解
转载自:JVM七大垃圾回收器下篇G1(Garbage First)
G1回收器:区域化分代式既然我们已经有了前面几个强大的GC,为什么还要发布Garbage First (G1)GC? 原因就在于应用程序所应对的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序正常进行,而经常造成STW的GC又跟不上实际的需求,所以才会不断地尝试对GC进行优化。G1 (Garbage一First) 垃圾回收器是在Java7 update4之后引入的一个新的垃圾回收器,是当今收集器技术发展的最前沿成果之一。 与此同时,为了适应现在不断扩大的内存和不断增加的处理器数量,进一步降低暂停时间(pause time) ,同时兼顾良好的吞吐量。 官方给G1设定的目标是在延迟可控(低暂停)的情况下获得尽可能高的吞吐量(高吞吐),所以才担当起“全功能收集器”的重任与期望。
为什么名字叫做Garbage First (G1)呢?
因为G1是一个并行回收器,它把堆内存分割为很多不相关的区域(Region) (物理上 不连续的)。使用不同的Region来表示Eden、幸存者0区,幸存者1区,老年代等。 ...
服务器性能优化
在一些高QPS的场景下,服务器可能面临的挑战和问题总结。
服务器一定要有流控功能和降级预案,一些接口可以提供有损服务,最差情况只要保证核心业务不出问题。
梳理出各个关键接口在不可用时的表现,和处理方案,已经可能面临的问题,落实到文档,一步步攻坚。
核心业务和接口预估最高QPS,根据QPS指标做好全链路压测。
做好性能监控和报警,实时查看大盘数据。
最常出现性能瓶颈的地方:
登录,特别是注册新用户。流控限制服务的承载上限,一定不能超过当前服务的承载。流控触发后,前端进行友好的过渡,根据不同的游戏类型进行特定场景的处理,比如进行一局单机游戏。
针对一些更极端的场景,可预见的某个时间段,会有大量的用户登录和创建,前端不验证流控前,直接预先将登录进行打散。针对大量创建用户引起的数据库性能瓶颈问题,可以预先生成一大批新用户数据,放入缓存。
注意玩家退出或掉线的逻辑,是否有一些数据回写,判断是否会成为瓶颈。
数据库可能出现问题的地方:
Mongo 提前关闭autosplit,movechunk,retryWrites。
数据库连接要预热。
前端要注意的一些点:
提供1到2个备用的资源CD ...
WordPress迁移Hexo
搬新家了!在用了三年多WordPress后还是决定尝试下使用一些轻量的框架来搭建站点,比如Hexo。放弃WordPress主要出于以下几个方面的考虑吧:
成本:需要单独的服务器部署。
效率:功能大而全,便利性方面还是很好的,但是敏捷性方面就稍显欠缺了,而Hexo支持MD语法,大大激活创作效率。
性能:网页加载图片的速度较慢。
美观:简洁才是王道
杀鸡用牛刀:在个人站点方面,静态的Hexo完全够了。
站点搭建完了,现在的方案是,本地编写MD文件,提交Github,Travis自动发布。皮肤:next
皮肤:butterfly
后续需要的插件陆续添加吧。主要参考的文章:
Travis CI
Hexo部署
常用笔记
新建博文:hexo new post $title
新建草稿:hexo new draft $title
文章目录:source_posts
图片目录:source\images
https://typora.io/ markdown工具
Markdown语法
参考链接
参考链接
met皮肤
hexo博客插入图片与视频方法图片插入Hexo有多种图片插入方式,可以将图 ...