关于k8s集群中的容器资源限制以及JAVA应用运行参数设置

背景 目前存在一些应用频繁重启的问题,查看日志,有的显示容器被驱逐(evic),这种情况一般为资源使用超过配置的限制,k8s为了整体稳定性进行服务的重启,防止一些应用层的内存泄漏问题导致整体服务稳定性下降 针对此问题,需要调研k8s集群中,容器的内存分配,以及应用是否能正确识别到分配的容器内存限制 现状 目前线上的java应用使用的基础镜像为:library/openjdk8-skywalking:latest 此镜像的项目地址为 :middleware/docker-image-openjdk8-skywalking 此基础镜像包含的软件为: openjdk-8u212 nginx curl vim php7 php7-pecl-mongodb skywalking 线上使用配置 通过设置环境变量,运行脚本使用环境变量配置jvm参数实现 ![](https://i.loli.net/2021/04/29/nQJ4sRZp791HAhi.png) 本地测试结果 自动方案 不带jvm参数运行,看默认配置为多少内存,给容器设置最大内存限制为2GB,jvm设置的最大堆内存为455.50M,约为1/4最大内存,符合预期 docker run -m 2GB –rm reg.xxxx.cn/library/openjdk8-skywalking:latest java -XshowSettings:vm -version VM settings: Max. Heap Size (Estimated): 455.50M Ergonomics Machine Class: server Using VM: OpenJDK 64-Bit Server VM openjdk version “1.8.0_212” OpenJDK Runtime Environment (IcedTea 3.12.0) (Alpine 8.212.04-r0) OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode) OpenJdk 自动识别到容器限制后,OpenJdk把最大堆设置为了大概容器内存的1/4,对内存的浪费不可谓不大。 我们尝试将MaxRAMFraction设置手动设置为1,可以看到最大堆内存将被设置为1.78G,我觉得这样的资源利用率比较高 ...

August 28, 2020 · 1 min · 178 words · Jimmy

杭州永辉菜价

西蓝花一小颗 1.5/斤 1元 南瓜一小片 0.8/斤 4元 芹菜少点 6/斤 6.9 姜两块 5.5/斤 5.7 黄瓜 1.5/斤 元 茄子 2/斤 3.5 菠菜 4元/斤 香菜 8.5斤 小油菜 3/斤3元 生菜 3/斤 3 元 香菇 7.5/斤+10/斤*0.5=12 西红柿 2.5/斤 4.9元 大葱 2块/斤 5元 黄豆芽两块钱的 2元 鸡胸肉四块 7/斤 10元 干豆腐 4元

August 22, 2020 · 1 min · 43 words · Jimmy

spring-boot不同的启动的方式

以mvn运行 #使用prod配置运行 mvn spring-boot:run -Dspring-boot.run.profiles=prod #后台运行无额外日志文件 nohup mvn spring-boot:run -Dspring-boot.run.profiles=prod >/dev/null 2>&1 & 以包运行 #默认配置 java -jar xxxx.jar #指定配置文件或者参数 java -Xms128m -Xmx256m -jar xxxx.jar --spring.profiles.active=prod #后台运行无额外日志文件 nohup java -Xms128m -Xmx256m -jar xxxx.jar --spring.profiles.active=prod >/dev/null 2>&1 &

March 18, 2020 · 1 min · 36 words · Jimmy

美团2019年货分享

📝美团年货分享 感谢关注美团技术团队。我们每周会推送来自一线的实践技术文章,涵盖前端(Web、iOS和Android)、后台、大数据、AI/算法、测试、运维等技术领域。在2019年春节到来之际,我们精选了114篇技术干货,制作成一本厚达1200多页的电子书呈送给大家。温馨提醒:文件有点大(全部下载约350M),请耐心等候下载。建议通过WIFI下载,或将地址复制到PC端,使用浏览器下载。【前端系列】下载链接:http://dpurl.cn/DWVhPpS【后台系列】下载链接:http://dpurl.cn/obtIVn【系统系列】下载链接:http://dpurl.cn/zTDWq8Q【算法系列】下载链接:http://dpurl.cn/ODj5qAB【运维系列】下载链接:http://dpurl.cn/6zjgHFj【测试系列】下载链接:http://dpurl.cn/wfKQqy【工程师成长系列】下载链接:http://dpurl.cn/p5sPoKT【2018年美团点评技术文章合辑】下载链接:http://dpurl.cn/iLGBtuS 🤗总结归纳 致谢:

March 5, 2019 · 1 min · 4 words · Jimmy

go-web程序的热更新

当使用go开发web程序时,修改点代码就得编译,虽然编译速度很快,但是也累啊,想起java的spring-boot有热更新插件, php根本都不需要重启,go怎么可以落后。 一顿搜索后,找到了gin和fresh,都挺好用的 gin cd path/to/app gin run main.go fresh cd path/to/app fresh 懒人有懒福~

September 30, 2018 · 1 min · 14 words · Jimmy

Manjaro安装fusuma

Manjaro安装fusuma 环境:Manjaro ██████████████████ ████████ jimersylee@jimersylee-laptop ██████████████████ ████████ OS: Manjaro 17.1.12 Hakoila ██████████████████ ████████ Kernel: x86_64 Linux 4.14.67-1-MANJARO ██████████████████ ████████ Uptime: 3h 12m ████████ ████████ Packages: 1184 ████████ ████████ ████████ Shell: zsh 5.5.1 ████████ ████████ ████████ Resolution: 1920x1080 ████████ ████████ ████████ DE: GNOME ████████ ████████ ████████ WM: GNOME Shell ████████ ████████ ████████ WM Theme: Adapta-Nokto-Maia ████████ ████████ ████████ GTK Theme: Adapta-Nokto-Maia [GTK2/3] ████████ ████████ ████████ Icon Theme: Papirus-Adapta-Maia ████████ ████████ ████████ Font: Noto Sans 11 ████████ ████████ ████████ CPU: Intel Core i7-8550U @ 8x 4GHz [47.0°C] GPU: Mesa DRI Intel(R) UHD Graphics 620 (Kabylake GT2) RAM: 6157MiB / 15928MiB 将用户加入输入组 sudo gpasswd -a $USER input sudo reboot 安装ruby环境,安装fusuma包 #安装ruby sudo pacman -S ruby sudo gem install fusuma # 配置 #将ruby程序目录加入路径 echo "export PATH=$PATH:/home/jimersylee/.gem/ruby/2.5.0/bin" >> ~/.profile source ~/.profile #人工启动 fusuma -d #加入开机启动 /usr/share/applications 新建一个.desktop快捷方式,配置好 使用tweaks 添加 startup application

September 12, 2018 · 1 min · 136 words · Jimmy

Manjaro安装Mariadb

Manjaro安装Mariadb 环境:Manjaro ██████████████████ ████████ jimersylee@jimersylee-laptop ██████████████████ ████████ OS: Manjaro 17.1.12 Hakoila ██████████████████ ████████ Kernel: x86_64 Linux 4.14.67-1-MANJARO ██████████████████ ████████ Uptime: 3h 12m ████████ ████████ Packages: 1184 ████████ ████████ ████████ Shell: zsh 5.5.1 ████████ ████████ ████████ Resolution: 1920x1080 ████████ ████████ ████████ DE: GNOME ████████ ████████ ████████ WM: GNOME Shell ████████ ████████ ████████ WM Theme: Adapta-Nokto-Maia ████████ ████████ ████████ GTK Theme: Adapta-Nokto-Maia [GTK2/3] ████████ ████████ ████████ Icon Theme: Papirus-Adapta-Maia ████████ ████████ ████████ Font: Noto Sans 11 ████████ ████████ ████████ CPU: Intel Core i7-8550U @ 8x 4GHz [47.0°C] GPU: Mesa DRI Intel(R) UHD Graphics 620 (Kabylake GT2) RAM: 6157MiB / 15928MiB 安装 sudo pacman -S mariadb 配置 #初始化 sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql #启动 sudo systemctl start mariadb #设置密码 mysql_secure_installation

September 9, 2018 · 1 min · 117 words · Jimmy

<Go build web application>的中文翻译版-第三章-连接数据

在上一章中,我们探索了在web应用中如何处理URLS和指引他们转到不同的页面.同时,我们通过net/http中的handle创建了动态的链接和动态的结果. 通过实现和扩展Gorilla toolkit的mux路由,我们通过正则表达式扩展了路由的能力,使其给予我们的应用更大的灵活性. 其实这是一些最流行的web服务器的特性.比如说Apache和Nginx都在路由中提供了方法去解析正则表达式. 但是这仅仅是构成web应用的基石.为了更加深入,我们需要去看看如何引入数据. 前一章的例子中静态文件服务依赖于硬编码,这显然是过时的且难以控制的. 但是幸运的是,从90年代末期开始,网站变得动态化,数据库开始统治世界.虽然APIs,微服务和NoSQL在某些领域替代了这些架构,但是这个架构在当今的Web开发中还是万金油的角色. 所以,事不宜迟,让我们开始获取一些动态数据 在这一章中,我们将学习以下几个主题 连接数据库 使用GUID美化URLs 处理404页面 连接一个数据库 为了连接数据库,Go的SQL接口提供了一个非常简单且可信赖的方式去连接拥有驱动的不同种类的数据库服务器. 目前,大部分流行的数据库都支持-MySQL,Postgres,SQLite,MSSQL和相当多的实现了Go提供的database/sql接口的数据库驱动. Note:在本书中,我们将会把MySQL和Postgres数据库使用最好的实践运用在多个例子上.安装MySQL和Postgres在Nix,Windows,OS X 系统的机器上是相当基础的工作 创建MySQL数据库 你可以选择设计任何你想要的应用,但是在这些例子中,我们将着手一个非常的简单的博客. 我们的目标是尽可能地在数据库中创建一些博客的入口,最好可以使用GUID在数据库中直接地获取数据和展示,如果博客的入口不存在,将展示错误页面. 为了实现这个需求,我们将创建一个包含了我们的页面的MySQL数据库.这个数据库将包含一个整数型的,自动递增的ID,一个全局唯一的标识,或者GUID,还有一些博客的初始数据. 简单起见,我们创建一个叫存储标题的page_title字段,存储页面内容的page_content字段,还有一个使用Unix时间戳的字段page_date. CREATETABLE `pages` ( `id` int(11) unsignedNOT NULL AUTO_INCREMENT, `page_guid` varchar(256)NOT NULLDEFAULT '', `page_title` varchar(256)DEFAULT NULL, `page_content` mediumtext, `page_date`timestampNOT NULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP, PRIMARYKEY (`id`), UNIQUEKEY `page_guid` (`page_guid`) )ENGINE=InnoDB AUTO_INCREMENT=2DEFAULTCHARSET=utf-8; 将page_guid标记为UNIQUE_KEY相当重要,如果我们允许出现重复的page_guid,在浏览某个网址的时候可能出现不准确的情况. 我们使用以下的语句插入一些blog数据 INSERTINTO `pages` (`id`, `page_guid`, `page_title`, `page_content`, `page_date`)VALUES (NULL, 'hello-world', 'Hello, World', 'I\'m so glad you found this page! It\'s been sitting patiently on the Internet for some time, just waiting for a visitor.',CURRENT_TIMESTAMP); 执行了上面的语句之后,我们就获得了初始数据 使用下面的代码来获得连接数据库的能力 package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "log" ) 我们导入MySQL驱动包来完成需求.通常,这意味着驱动是另一个包的实现.你能注意到使用 符号来导入包.你可能已经熟悉这点,作为一种快速且脏的方式去忽略类的实例的返回值.比如说x, :=something() 允许你去忽略第二个返回值.这经常也被开发者用在计划去使用一个库,但是目前还没有用到的情况.通过这种方式准备包,它允许导入声明而不引起编译期报错.虽然这不是推荐的做法,但是在预载入方法中使用下划线_或者空白标识符,好处是这是很常见的做法也普遍被接受. 其实,这全部依赖于你怎样以及为何使用标识符. const ( DBHost = "127.0.0.1" DBPort = ":3306" DBUser = "root" DBPass = "password!" DBDbase = "cms" ) 记得使用你自己的配置去替换以上值 ...

September 22, 2017 · 2 min · 386 words · Jimmy

<Go build web application>的中文翻译版本

目录 模块1:学习Go的Web开发 第一章:介绍和安装Go环境 安装Go 构建一个项目 引入包 介绍net包 你好,Web 本章总结 第二章:服务和路由 直接的文件服务 基本路由 使用Gorilla实现更复杂的路由 转发请求 处理基本的错误 本章总结 第三章:连接数据 连接一个数据库 使用GUID美化URLs 处理404错误 总结 第四章:使用模板 介绍模板,上下文和可视化 HTML模板和文本模板 渲染变量和安全性 使用逻辑和控制结构 本章总结 第五章:使用RESTful APIs进行前端集成 设置基本的API结构 RESTful架构和最佳实践 创建我们的第一个API 实现安全 使用POST创建数据 使用PUT更改数据 本章总结 第六章:Session和Cookies 设置cookies 存储用户的信息 初始化一个服务端的session 本章总结 第七章:微服务和通讯 介绍引入微服务 使用微服务的利弊 理解微服务的内核 微服务之间的通讯 在线上放一个信息 从其他服务读取信息 本章总结 第八章:记录日志和测试 介绍Go中的日志 记录日志到IO中 格式化你的输出 使用panics和fatal errors 介绍Go中的测试 本章总结 第九章:安全 在任何地方使用HTTPS-实现TLS 防止SQL注入 防范XSS攻击 防范CSRF跨站攻击 加密cookies 使用安全中间件 本章总结 第十章:缓存,代理和提高性能 确定瓶颈 实现反向代理 实现缓存 实现HTTP/2 本章总结 模块2:Go 编程蓝皮书 第一章:使用Web Sockets构建的聊天应用 一个简单的Web服务器 在服务器上建模一个聊天室和客户端 构建一个使用HTML和JavaScript的聊天客户端 跟踪代码获取内在的流程 本章总结 第二章:增加权限 拦截所有请求 创建一个社交化的登录页面 动态路径 OAuth2 把你的APP告诉权限提供者 实现额外的登录 本章总结 第三章:3个方法去实现文件缩略图 在权限服务器上的头像 实现Gravatar 上传头像图片 整合3种实现 本章总结 第四章:查询域名的命令行工具 命令行工具的管道设计 5个简单的程序 编写所有5个程序 本章总结 第五章:构建分布式系统,与复杂的数据交互 系统设计 安装环境 获取Twitter的投票 计算投票 运行我们的解决方案 本章总结 第六章:通过RESTful web数据接口对外提供数据和功能 RESTful API 设计 在处理器间共享数据 包装处理函数 响应 理解请求 一个简单的主函数去处理我们的API 处理节点 一个web客户端去消费API 运行解决方案 本章总结 第七章:随机推荐Web服务 项目预览 用代码展示数据 构造随机推荐 本章总结 第八章:文件备份系统 解决方案设计 备份包 用户命令行工具 备份守护工具 测试解决方案 本章总结 模块3:精通Go的高并发 第一章:介绍Go并发编程 介绍协程 实现延迟控制机制 理解协程与协同 实现通道 关闭与协程 构建一个使用协程和通道的爬虫 本章总结 第二章:理解并发模型 理解协程如何工作 同步和异步协程 可视化并发 RSS实战 CSP的一点介绍 Go和角色模型 面向对象 使用并发 管理线程 使用同步和互斥锁住数据 本章总结 第三章:开发并行策略 在复杂的并发中提高效率 使用竞争检查识别竞争条件 同步我们的并发操作 项目-多用户预约日历 一个多用户预约日历 风格说明 不变性说明 本章总结 第四章:应用中的数据完整性 深入理解互斥与同步 协程的代价 处理文件 更底层-实现C 分布式的Go 几种常见的一致性模型 使用memcached 本章总结 第五章:锁,区块和更好的通道 理解Go中的区块方法 清除协程 创建通道的通道 Pprof-一个令人惊叹的工具 处理死锁和错误 本章总结 第六章:C10K-Go中的一个无锁的Web服务器 攻克C10K问题 创建我们的C10K Web服务器 提供页面服务 多线程和利用多核 探索我们的Web服务器 本章总结 第七章:性能与可扩展性 Go的高性能 使用App Engine 分布式的Go 一些有用的库 内存维护 本章总结 第八章:并发程序架构 设计我们的并发程序 确定我们的需求 在Go中使用NoSQL作为数据存储 监控文件系统的变化 管理日志文件 处理配置文件 检测文件变化 备份文件 设计Web接口 还原文件的历史-命令行 检查服务器的健康度 本章总结 第九章:在Go中记录日志和测试并发 处理错误和记录日志 使用log4go包作为健壮的日志组件 使用runtime包作为细粒度的堆栈跟踪组件 本章总结 第十章:先进的并发和最佳实践 使用channels跨越基础 构建工作者 实现空通道区块 使用tomb实现对协程更多的细粒度的控制 使用通道定时 通过并发模式构建负载均衡器 选择单向和双向通道 使用泛型通道 使用Go的单元测试 使用Google的App Engine 使用最佳实践 本章总结

September 20, 2017 · 2 min · 226 words · Jimmy

Redis高可用架构

Redis高可用架构 前言 Redis是一个高性能的key-value数据库,现时越来越多企业与应用使用Redis作为缓存服务器。楼主是一枚JAVA后端程序员,也算是半个运维工程师了。在Linux服务器上搭建Redis,怎么可以不会呢?下面楼主就带着大家从0开始,依次搭建:Redis单机服务器 -> Redis主从复制 ->Redis-Sentinel高可用。逐步搭建出高可用的Redis缓存服务器。 搭建Redis 1. 下载并解压 首先从Redis官网下载Redis并解压,楼主使用的版本是4.0.2。依次执行如下命令: cd /opt wget http://download.redis.io/releases/redis-4.0.2.tar.gz tar -zcvf redis-4.0.2.tar.gz 如果没有安装gcc依赖包,则安装对应依赖包 yum install -y gcc-c++ tcl 2. 编译并安装 下载并解压完毕后,则对源码包进行编译安装,楼主的Redis安装路径为/usr/local/redis,同学们可以自行修改语句:make install PREFIX=你想要安装的路径 cd /opt/redis-4.0.2 make install PREFIX=/usr/local 复制Redis相关命令到/usr/sbin目录下,这样就可以直接执行这些命令,不用写全路径 cd /usr/local/redis/bin sudo cp redis-* /usr/sbin 3. 建立Redis配置文件 安装完成之后将 Redis 配置文件拷贝到系统配置目录/etc/下,redis.conf 是 Redis 的配置文件,redis.conf 在 Redis 源码目录,port默认 6379。 cp /usr/local/redis-4.0.2/redis.conf /etc/ Redis配置文件主要参数解析参考 daemonize no#redis进程是否以守护进程的方式运行,yes为是,no为否(不以守护进程的方式运行会占用一个终端) pidfile /var/run/redis.pid#指定redis进程的PID文件存放位置 port 6379#redis进程的端口号 bind 127.0.0.1#绑定的主机地址 timeout 300#客户端闲置多长时间后关闭连接,默认此参数为0即关闭此功能 loglevel verbose#redis日志级别,可用的级别有debug.verbose.notice.warning logfile stdout#log文件输出位置,如果进程以守护进程的方式运行,此处又将输出文件设置为stdout的话,就会将日志信息输出到/dev/null里面去了 databases 16#设置数据库的数量,默认为0可以使用select <dbid>命令在连接上指定数据库id save <seconds><changes>#指定在多少时间内刷新次数达到多少的时候会将数据同步到数据文件; rdbcompression yes#指定存储至本地数据库时是否压缩文件,默认为yes即启用存储; dbfilename dump.db#指定本地数据库文件名 dir ./#指定本地数据问就按存放位置; slaveof <masterip><masterport>#指定当本机为slave服务时,设置master服务的IP地址及端口,在redis启动的时候他会自动跟master进行数据同步 masterauth <master-password>#当master设置了密码保护时,slave服务连接master的密码; requirepass footbared#设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH<password>命令提供密码,默认关闭 maxclients 128#设置同一时间最大客户连接数,默认无限制;redis可以同时连接的客户端数为redis程序可以打开的最大文件描述符,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息 maxmemory<bytes>#指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区 appendonly no#指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no appendfilename appendonly.aof#指定跟新日志文件名默认为appendonly.aof appendfsync everysec#指定更新日志的条件,有三个可选参数no:表示等操作系统进行数据缓存同步到磁盘(快),always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全), everysec:表示每秒同步一次(折衷,默认值); 3.1 设置后端启动: 由于Redis默认是前端启动,必须保持在当前的窗口中,如果使用ctrl + c退出,那么Redis也就退出,不建议使用。 ...

September 5, 2017 · 6 min · 1085 words · Jimmy