首页 文章 精选 留言 我的

精选列表

搜索[环境],共10000篇文章
优秀的个人博客,低调大师

从JVM角度思考--如何预估线上环境机器资源大小

听说微信搜索《Java鱼仔》会变更强哦! 本文收录于github和gitee ,里面有我完整的Java系列文章,学习或面试都可以看看哦 (一)概述 如何给JVM虚拟机巧妙地设计参数对大部分开发来说一直是个随缘的事情,可能是去网上拷贝一套参数,可能是沿用公司其他应用的参数。但是这个随缘的操作可能就会给未来留下隐患。给JVM分配的内存过大倒是没什么问题,无非浪费点资源,但是如果分配的内存过小,就有可能导致频繁的Full GC,给人一种系统一直很卡的感觉。这篇文章就通过一个实例分析一下如何结合场景设置JVM虚拟机参数。 当然,本文更重要的是希望能通过预估参数的这个过程,让你更加了解虚拟机内部的一些东西,要想最准确的参数设置,用一些工具记录下JVM各个区域的变化会更有效。 (二)前置准备 系统基于JDK1.8,堆结构如下。 为了方便理解业务,本文以电商的交易系统为例进行讲解。在微服务架构下,目前主流的互联网公司都会把自己的业务拆分成多个服务架构,比如电商系统会分为交易微服务、购物车微服务、商品微服务等等,可能这个粒度会更细。一个底层架构会将这些微服务集成起来。实际上就是一个大的容器里放了一个个jar包。 (三)通常业务场景下的预估流程 一个交易微服务中会涉及到订单对象、优惠券对象、用户对象、交易记录对象等一系列对象,我们可以简单预估在一次交易中这些对象会占用的空间。预估的方式也很简单,八种基本类型直接带入字节大小,对象类型以基本类型为基础预估大小。只需要一个大致的值就行。 比如每次交易中一个订单对象大约是1kb,优惠券对象2kb,用户对象4kb,交易记录对象4kb,除此之外还可能会存在的List集合、数组等等。大约一次交易中产生的对象大约在25kb左右。 一个每日交易量在100万的系统,交易量主要集中在6个小时中,平均每秒最大会有40笔订单的产生。也就意味着每秒产生对象大小是1M。这些产生的对象在一次交易结束后都会被当成垃圾,也就意味着每秒会产生1M的垃圾。 假设我们只有一台2核4G的服务器,分配给堆的内存一般就1.5G左右,通过计算,可以算出堆中每个区域的大小,如下图: 通过计算可以得出,每400秒,400M的Eden区就满了,会进行一次young GC。98%的垃圾会被回收,意味着将会有8M左右的垃圾进入在survivor转移。一些对象在经过几次young GC之后会进入到老年代中,这种情况Full GC的频率会很低。虽然400秒一次youngGC略微还是快了些,但是对于系统而言基本上没有影响。 (四)特殊业务场景下的预估流程 现在公司打算开展一次一小时的补贴活动,在活动的这一个小时时间内,订单数量可能会是之前的20倍,也就意味着每秒会有800笔订单的产生,每秒会产生20M的垃圾,这下会发生什么呢? Eden区20秒就被占满,20秒执行一次youngGC,此时由于订单过于多,可能部分接口响应会达到几秒甚至几十秒,这些对象在经过几次youngGC之后就会逐步就会进入到老年代中。一般在线上一个小时内出现2次以上FullGC就得告警了。 这种情况下就意味着我们对机器资源以及JVM虚拟机内存需要重新考虑了。 首先考虑提升JVM虚拟机内存,由于硬件限制,JVM虚拟机内存的提高首先要提高机器的性能,我们从双核4G升级成4核8G。分配给堆4.5G的内存。这个时候Eden区就会有1200M的内存,同样条件下,1分钟才会执行一次youngGC。20秒提高到1分钟能保证响应慢的接口对象也能在youngGC中被消灭,而不会进入到老年代中。 同时我们可以把一台机器升级为3台机器,负载均衡后每台机器的订单压力是原来的1/3,youngGC时间提升为原来的3倍,同时接口响应时间加快。基本上3台4核8G的机器就能满足这次活动。 (五)总结 预估之后,并非意味着就完全没问题了,还需要在上线时备好更多机器,防止意外发生。实践能给你带来最好的答案。

优秀的个人博客,低调大师

k8s应用部署(实际生产环境,无坑版本)

2 --> 一.Docker harbor搭建 二.构建提交镜像 三.k8s部署 一.Docker harbor搭建 1.1 .docker harbor部署(https://www.cnblogs.com/sanduzxcvbnm/p/13724770.html) 1.2 创建docker harbor认证secret kubectl create secret docker-registry registry-pull-secret --docker-server=10.206.16.4 --docker-username=admin --docker-password=Rolinabc123 --docker-email=xxxx@qq.com 1.3 进入harbor界面,创建项目fronted 二.构建提交镜像 2.1 进入网站目录编写dockerfile From nginx WORKDIR /var/www/html add h5game.xxx.com.tar.gz /var/www/html 2.2 修改客户端docker配置文件支持http vim /etc/docker/daemon.json "insecure-registries" : ["10.206.16.4"] 2.3 构建镜像推送到harbor docker login 10.206.16.4 docker build 10.206.16.4/fronted/h5game.xxx.com:v1 . docker push 10.206.16.4/fronted/h5game.xxx.com:v1 三.k8s部署 3.1 namespace创建 namespace.yaml apiVersion: v1 kind: Namespace metadata: name: fronted 3.2 configmap配置创建 configmap.yaml kind: ConfigMap # 对象类型 apiVersion: v1 # api 版本 metadata: # 元数据 name: h5sdk # 对象名称 namespace: fronted data: # key-value 数据集合 nginx.conf: | # 将 nginx config 配置写入 ConfigMap 中,经典的 php-fpm 代理设置,这里就不再多说了 events { } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; sendfile on; gzip on; tcp_nopush on; tcp_nodelay on; server_tokens off; keepalive_timeout 0; client_body_timeout 10; client_header_timeout 10; client_header_buffer_size 1k; large_client_header_buffers 4 4k; output_buffers 1 32k; client_max_body_size 64m; client_body_buffer_size 256k; server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html/h5game.sentsss.com; #index index.php; server_name _; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location / { index index.html index.htm index.php; if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; break; } } access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log error; #location ~ \.php$ { # include fastcgi_params; # fastcgi_param REQUEST_METHOD $request_method; # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # fastcgi_pass 127.0.0.1:9000; } } 3.3 部署文件 deployment.yaml kind: Deployment apiVersion: apps/v1 metadata: name: h5sdk namespace: fronted spec: selector: kind: Deployment apiVersion: apps/v1 metadata: name: h5sdk namespace: fronted spec: selector: matchLabels: app: h5sdk replicas: 2 template: metadata: labels: app: h5sdk spec: #nodeName: k8s-node-01 imagePullSecrets: - name: registry-pull-secret containers: - name: nginx image: 10.206.16.4/fronted/www.h5sdk.xxx.com:v1 ports: - containerPort: 80 volumeMounts: #- mountPath: /var/www/html #name: nginx-www - mountPath: /etc/nginx/nginx.conf subPath: nginx.conf name: nginx-config - mountPath: /var/log/nginx name: nginx-log - mountPath: /etc/localtime name: timezone #探针查看服务是否可用是否加入service livenessProbe: httpGet: path: /user.html port: 80 initialDelaySeconds: 30 periodSeconds: 10 successThreshold: 1 failureThreshold: 3 timeoutSeconds: 1 readinessProbe: httpGet: path: /user.html port: 80 initialDelaySeconds: 30 periodSeconds: 10 successThreshold: 1 failureThreshold: 3 timeoutSeconds: 1 lifecycle: preStop: exec: command: ["/bin/bash","-c","sleep 20"] resources: limits: cpu: 40m memory: 40Mi requests: cpu: 20m memory: 20Mi affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - {key: app, operator: In, values: ["h5sdk"]} topologyKey: fronted volumes: - name: nginx-log hostPath: path: /opt/log/nginx/h5sdk - name: nginx-config configMap: name: h5sdk - name: timezone hostPath: path: /usr/share/zoneinfo/Asia/Shanghai #- name: nginx-www # emptyDir: {} 3.4 svc的创建 svc.yaml apiVersion: v1 kind: Service metadata: name: h5sdk namespace: fronted spec: selector: #project: h5sdk app: h5sdk ports: - port: 80 targetPort: 80 3.5 ingress创建 ingress.yaml kind: Ingress # 对象类型 apiVersion: networking.k8s.io/v1beta1 metadata: name: h5sdk namespace: fronted spec: rules: - host: h6game.xxx.com http: paths: - path: / backend: serviceName: h5sdk # 需要与servicename一致 servicePort: 80 # 与 Service 的 port 一致 3.6 hpa创建 hpa.yaml(记得提前安装metric) kind: HorizontalPodAutoscaler # 对象类型,简称 hpa,水平自动伸缩 apiVersion: autoscaling/v2beta2 # autoscaling/v2beta2 与 autoscaling/v1 的 API 有很大的不同,注意识别两者的差异 metadata: name: h5sdk namespace: fronted spec: scaleTargetRef: # 伸缩的目标对象 apiVersion: apps/v1 # 对象版本 kind: Deployment # 目标对象的类型 name: h5sdk # 目标对象的名称 minReplicas: 2 # 最小副本数 maxReplicas: 4 # 最大副本数 metrics: # 指标 - type: Resource # 类型:资源 resource: name: memory # 内存 target: type: Utilization averageUtilization: 70 # 1% 这个值是为了实验,具体值请参考业务方实际情况而定 - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 3.7 腾讯云申请一个负载均衡,然后将所有node节点加入到负载均衡 3.8 域名解析到负载均衡的ip上

优秀的个人博客,低调大师

CLion 2021.2 EAP 发布,C/C++ 跨平台集成开发环境

CLion 2021.2 EAP 现已发布。该 EAP 版本是免费使用的,但是可能不稳定且质量较低,其主要目的是让用户评估即将被添加到下一个版本的功能,并在早期阶段分享他们的反馈。 主要更新内容 CMake 增强 CLion 现在捆绑并支持 CMake 3.20 ,该版本包括 CMake 预设、对 CMake 文件 API 的重大更新、对 C++23 编译器模式的支持以及针对 CUDA 开发者的更新。 CLion 使用 CMake Profiles 来进行配置,且现在支持从 CMake 预设中导入信息。不过,目前导入的预设是只读的,且只支持 buildPresets 预设。导入后,CLion 中 的 CMake 预设会得到一个指向 CLion 工具链的链接。 除了新的 CMakeList.txt 文件模板外,CLion 现在还为 CMake 项目提供了可编辑的模板。用户可以在 Settings/Preferences | Editor | File and Code Templates | Other找到它。 在 Run/Debug 配置的 "Before Launch" 部分,用户可以指定在启动所选目标之前要执行的任务,现在用户还可以在这个阶段添加一个 CMake 目标任务来执行 CMake 目标。 生存周期分析 CLion 现在支持生存周期分析,例如CLion 会警告用户,在临时字符串被销毁后,字符串视图引用了一个无效的对象。 CLion 也会捕捉到各种局部变量指向超出范围的内存的情况。 分析还支持 GSL 注释。 Cling 支持 CLion 现在支持交互式的 C++ 解释器 Cling。Cling建立在 Clang 和 LLVM 基础之上,对原型设计和学习 C++ 非常有用。 支持将当前代码行发送到 Cling 会话。 不过,用户暂时不能从 CLion 内部开始向 Cling 可执行文件添加额外的参数,所以无法真正改变 C++ 语言标准或其他选项。另外,Cling 会话在项目目录或主目录内启动(如果当前没有打开项目)。当从一个不在项目根目录下的文件向 Cling 发送当前行时,相对路径可能会出错。 WSL 增强 Clion 现在使用专门的 WSL API 启动 WSL,这使得配置 WSL 更加容易。而且不仅支持从微软商店安装的 WSL,而且还支持从自定义发行版安装的WSL。 更多详细内容,请查看官方公告。

优秀的个人博客,低调大师

CLion 2021.1 Beta 发布,C/C++ 跨平台集成开发环境

CLion 2021.1 Beta 已正式发布,新版本修复了项目模型和更多的 MISRA 检查。 主要更新内容 对于 Makefile 项目 更新 Makefile 项目所使用的工具链会触发项目的重新加载 提取大量项目的 make target 现在可以正常工作了 对于使用 MinGW 工具链的 Makefile 项目,CLion 现在可以在加载项目时正确处理带 "\" 和 "/" 的目录 对于汇编数据库项目 Clang-cl 现在支持此类项目 新的 MISRA C 和 C++ 检查 异常对象不应具有指针类型 一些新的检查现在禁止使用特定的库函数,例如 stdlib.h 的 bsearch 和 qsort,ctime 库的时间处理函数,或者 cstdlib 库的 atof、atoi 和 atol 详情请查看更新公告。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册