golang 开源项目 这个项目可以理解为针对互联网IT人打造的中文版awesome-go 。已有的awesome-go项目,汇总了很多go开源项目 , 但存在的问题是收集太全了,而且每个项目没有详细描述 。
本项目作为awesome-go的一个扩展,根据go语言中文社区提供的资料 , 还有互联网企业架构设计中的常见组件分类,共精心挑选了153个开源项目(项目不限于在github开源的项目),分成以下17个大类 。
项目初衷是帮助到那些想学习和借鉴优秀golang开源项目 , 和在互联网架构设计时期望快速寻找合适轮子的人 。
ps: 以下项目 star数均大于100,且会定期检查项目的url,剔除无效链接 。每个分类下的项目会按照 star数从高到低 进行排列 。
golang配制高性能sql.DB有很多教程是关于Go的sql.DB类型和如何使用它来执行SQL数据库查询的 。但大多数内容都没有讲述SetMaxOpenConns(),SetMaxIdleConns()和 SetConnMaxLifetime()方法,您可以使用它们来配置sql.DB的行为并改变其性能 。
转自:
整理:go语言中文文档:
在本文我将详细解释这些设置的作用,并说明它们所能产生的(积极和消极)影响 。
一个sql.DB对象就是一个数据库连接池,它包含“正在用”和“空闲的”连接 。一个正在用的连接指的是 , 你正用它来执行数据库任务,例如执行SQL语句或行查询 。当任务完成连接就是空闲的 。
当您创建sql.DB执行数据库任务时,它将首先检查连接池中是否有可用的空闲连接 。如果有可用的连接,那么Go将重用现有连接,并在执行任务期间将其标记为正在使用 。如果池中没有空闲连接 , 而您需要一个空闲连接,那么Go将创建一个新的连接 。
默认情况下,在同一时间打开连接的数量是没有限制(包含使用中 空闲) 。但你可以通过SetMaxOpenConns()方法实现自定义限制,如下所示:
在这个示例代码中,连接池现在有5个并发打开的连接数 。如果所有5个连接都已经被标记为正在使用,并且需要另一个新的连接,那么应用程序将被迫等待 , 直到5个连接中的一个被释放并变为空闲 。
为了说明更改MaxOpenConns的影响,我运行了一个基准测试,将最大打开连接数设置为1、2、5、10和无限 。基准测试在PostgreSQL数据库上执行并行的INSERT语句 , 您可以在这里找到代码 。测试结果:
对于这个基准测试,我们可以看到,允许打开的连接越多,在数据库上执行INSERT操作所花费的时间就越少(打开的连接数为1时,执行速度3129633ns/op,而无限连接:531030ns/op——大约快了6倍) 。这是因为允许打开的连接越多 , 可以并发执行的数据库查询就越多 。
默认情况下,sql.DB允许连接池中最多保留2个空闲连接 。你可以通过SetMaxIdleConns()方法改变它,如下所示:
从理论上讲,允许池中有更多的空闲连接将提高性能 , 因为这样就不太可能从头开始建立新连接——因此有助于提升数据库性能 。
让我们来看看相同的基准测试 , 最大空闲连接设置为none, 1,2,5和10:
当MaxIdleConns设置为none时,必须为每个INSERT从头创建一个新的连接,我们可以从基准测试中看到,平均运行时和内存使用量相对较高 。
只允许保留和重用一个空闲连接对基准测试影响特别明显——它将平均运行时间减少了大约8倍,内存使用量减少了大约20倍 。继续增加空闲连接池的大小会使性能变得更好,尽管改进并不明显 。
那么,您应该维护一个大的空闲连接池吗?答案取决于应用程序 。重要的是要意识到保持空闲连接是有代价的—它占用了可以用于应用程序和数据库的内存 。
还有一种可能是,如果一个连接空闲时间太长,那么它可能会变得不可用 。例如,MySQL的wait_timeout设置将自动关闭任何8小时(默认)内未使用的连接 。
当发生这种情况时,sql.DB会优雅地处理它 。坏连接将自动重试两次,然后放弃,此时Go将该连接从连接池中删除,并创建一个新的连接 。因此,将MaxIdleConns设置得太大可能会导致连接变得不可用,与空闲连接池更小(使用更频繁的连接更少)相比 , 会占有更多的资源 。所以,如果你很可能很快就会再次使用 , 你只需保持一个空闲的连接 。
最后要指出的是,MaxIdleConns应该总是小于或等于MaxOpenConns 。Go强制执行此操作,并在必要时自动减少MaxIdleConns 。
现在让我们看看SetConnMaxLifetime()方法,它设置连接可重用的最大时间长度 。如果您的SQL数据库也实现了最大连接生命周期 , 或者—例如—您希望方便地在负载均衡器后交换数据库,那么这将非常有用 。
你可以这样使用它:
在这个例子中,所有的连接都将在创建后1小时“过期”,并且在过期后无法重用 。但注意:
从理论上讲,ConnMaxLifetime越短,连接过期的频率就越高——因此,需要从头创建连接的频率就越高 。为了说明这一点,我运行了将ConnMaxLifetime设置为100ms、200ms、500ms、1000ms和无限(永远重用)的基准测试,默认设置为无限打开连接和2个空闲连接 。这些时间段显然比您在大多数应用程序中使用的时间要短得多,但它们有助于很好地说明行为 。
在这些特定的基准测试中,我们可以看到,与无限生存期相比,在100ms生存期时内存使用量增加了3倍以上,而且每个INSERT的平均运行时也稍微长一些 。
如果您在代码中设置了ConnMaxLifetime , 那么一定要记住连接将过期(随后重新创建)的频率 。例如 , 如果您总共有100个连接,而ConnMaxLifetime为1分钟,那么您的应用程序可能每秒钟杀死和重新创建1.67个连接(平均值) 。您不希望这个频率太大,最终会阻碍性能,而不是提高性能 。
最后,如果不说明超过数据库连接数量的硬限制将会发生什么 , 那么本文就不完整了 。为了说明这一点,我将修改postgresql.conf文件,这样总共只允许5个连接(默认是100个)…
然后在无限连接的情况下重新运行基准测试……
一旦达到5个连接的硬限制,数据库驱动程序(pq)立即返回一个太多客户端连接的错误消息,而无法完成INSERT 。为了防止这个错误 , 我们需要将sql.DB中打开连接的最大总数(正在使用的 空闲的)设置为低于5 。像这样:
现在,sql.DB在任何时候最多只能创建3个连接,基准测试运行时应该不会出现任何错误 。但是这样做需要注意:当达到开放连接数限制,并且所有连接都在使用时,应用程序需要执行的任何新的数据库任务都将被迫等待 , 直到连接标记为空闲 。例如,在web应用程序的上下文中,用户的HTTP请求看起来会“挂起”,甚至在等待数据库任务运行时可能会超时 。
为了减轻这种情况,你应该始终在一个上下文中传递 。在调用数据库时,启用上下文的方法(如ExecContext()),使用固定的、快速的超时上下文对象 。
总结
1、根据经验,应该显式设置MaxOpenConns值 。这应该小于数据库和基础设施对连接数量的硬性限制 。
2、一般来说,更高的MaxOpenConns和MaxIdleConns值将带来更好的性能 。但你应该注意到效果是递减的,连接池空闲连接太多(连接没有被重用,最终会变坏)实际上会导致性能下降 。
3、为了降低上面第2点带来的风险,您可能需要设置一个相对较短的ConnMaxLifetime 。但你也不希望它太短,导致连接被杀死或不必要地频繁重建 。
4、MaxIdleConns应该总是小于或等于MaxOpenConns 。
对于中小型web应用程序,我通常使用以下设置作为起点,然后根据实际吞吐量水平的负载测试结果进行优化 。
php如何把自身进程设置为系统进程进程管理-防止进程成为僵尸进程
创建好了进程go语言中文论坛 , 那么怎么对子进程进行管理呢?
使用信号 , 对子进程go语言中文论坛的管理,一般有两种情况:(推荐学习:PHP编程从入门到精通)
posix_kill():此函数并不能顾名思义,它通过向子进程发送一个信号来操作子进程 , 在需要要时可以选择给子进程发送进程终止信号来终止子进程;
pcntl_waitpid():等待或返回forkgo语言中文论坛的子进程状态 , 如果指定的子进程在此函数调用时已经退出(俗称僵尸进程),此函数将立刻返回,并释放子进程的所有系统资源,此进程可以避免子进程变成僵尸进程,造成系统资源浪费;
孤儿进程:父进程挂了 , 子进程被pid=1的init进程接管(wait/waitpid) , 直到子进程自身生命周期结束被系统回收资源和父进程 采取相关的回收操作
僵尸进程:子进程exit退出,父进程没有通过wait/waitpid获取子进程状态 , 子进程占用的进程号等描述资源符还存在,产生危害:例如进程号是有限的,无法释放进程号导致未来可能无进程号可用
**父进程中使用:pcntl_wait或者pcntl_waitpid的目的就是防止worker成为僵尸进程
作用:使用pcntl_wait()后,在子进程死掉后,父进程也会被停止**
最后我们通过下图来简单的总结和描述这个多进程实现的过程:
a34c883897ee2a99833e0ad1e26c1fd4.png
进程管理-进程间通信
队列:如Redis,推荐
socket:推荐
管道:实现复杂,且管道(pipe),使用文件形式存在,存在硬盘IO性能瓶颈
信号:承载信息量少,不好管理
进程管理-切换为守护进程
使用实现
php deadloop.php
相关资源:Nginx使用的php-fpm的两种进程管理方式及优化-其它代码类资源...
打开CSDN APP,看更多技术内容
php 进程管理,PHP 进程管理器 PHP-FPM_阿喵看海外的博客
php-fpm是PHP的一个进程管理器 。php下面的众多work进程皆有php-fpm进程管理器管理 。php-fpm的工作原理 php-fpm全名是PHP FastCGI进程管理器 。php-fpm启动后会先读php.ini,然后再读相应的conf配置文件,conf配置可以覆盖php.ini的配置 。
继续访问
php-fpm解读-进程管理的三种模式_april2nd的博客_php-fpm...
php-fpm进程管理一共有三种模式:ondemand、static、dynamic,我们可以在同一个fpm的master配置三种模式,看下图1 。php-fpm的工作模式和nginx类似,都是一个master,多个worker模型 。每个worker都在accept本pool内的监听套接字(linux已不存在惊...
继续访问
浅谈PHP进程管理
这篇文章是对之前一篇文章的补充和改进, 创建一个主(master)进程 , 主进程安装定时器,每隔5分钟检测一次队列长度,根据队列长度计算需要的worker进程 , 然后创建或者杀掉子进程 。这样做的好处是防止队列堆积,任务得不到及时处理 。更新业务代码,只需要reload操作即可 。整个流程有以下知识点: 创建守护进程的步骤: 设置默认文件权限 fork一个进程,父进程退出 调用setsid创建一个新的会话 将当前工作目录更改为根目录 关闭不再需要的文件描述符 使用信号实现定时器 上一篇定时器依赖于系统的定时任务,这次使用闹钟信号实现,php 5.3.0以下的版本依赖于ticks,
php 脚本 fpm缓存,PHP生命周期及fpm(FastCGI进程管理器)的运作方式
PHP在web方式中如何改了文件就立即生效的,重要的几个概念:sapi: 可以简单的理解为php引擎对外的一个统一接口,使得php可以和外部程序进行交互php的生命周期中关键四个调用: MINT - RINT - RSHUTDOWN - MSHUTDOWNfpm: fastcgi进程管理器fpm方式的流程就是:fpm通过sapi接口与php进程交互1.fpm启动会调用各扩展...
继续访问
Linux下搭建PHP开发环境,Php-Fpm进程管理 。_黑夜开发者的博客
目前PHP项目开发几种比较流行的架构搭建中,LNMP在性能方面是最好的,正因为如此,使得LNMP架构逐渐流行起来,今天,前面提到了Nginx部署,由于项目实际环境的需要,今天就在说一下怎么部署PHP 。环境 ...
继续访问
php而为,为高负载而生的 PHP 进程管理器 —— PHP-PM (PPM)
PHP-PM 可以用于php应用程序的进程管理,增压和负载均衡.它使用 ReactPHP 实现php的事件驱动和非阻塞I/O 。它是基于 ReactPHP,最好是工作在基于请求-响应式的框架,像Symfony的HTTPKernel 。这样做是为了减少php启动(包括变量声明,加载和...
继续访问
最新发布 php进程管理
php 进程管理 tasks 过多
继续访问
PHP进程实现管理
运行环境为Linux,模式为CLI DEMO /*要创建的子进程*/ $manager = [ 'work1', 'work2', 'work3', ]; /*当前进程名称*/ $status = file_exists('/proc/' . getmypid() . '/status'); $bash = '-'; if ($status) { $bash = file('/proc/' . getmypid() . '/status', FILE_IGNORE.
继续访问
php的管理进程管理利器--php-fpm_weixin_33778778的博客
mod_php 模式是将php模块安装到apache中,所以每一次apache结束的请求呢,都会产生一条进程,这个进程就完整的包括php的各种运算计算等操作 。从图中我们很清晰的可以看到,apache每接收一个请求,都会产生一个进程来连接php通过sapi来完成请求...
继续访问
php-frm进程管理,PHP内核探索-进程管理
进程管理方式首先我们了解一下php的三种不同的进程管理方式:static:静态管理进程 。在启动时,master按照pm.max_children配置fork出对应数量的work进程,即work的进程是固定不变的 。dynamic:动态管理进程 。在fpm启动时先按照pm.start_servers初始化一定数量的work进程,运行期间如果master发现空闲work进程低于pm.min_spare_s...
继续访问
理解php-fpm的两种执行方式
前段时间配置php-fpm的时候,无意间发现原来go语言中文论坛他还有两种执行方式 。与Apache一样,go语言中文论坛他的进程数也是可以根据设置分为动态和静态的 。关于Apache的工作方式及对应的设置方法,我已经在《Ubuntu下配置Apache的Worker模式》一文中写出 , 这里不再多说 。而php-fpm也是同样存在两种方式,一种是直接开启指定数量的php-fpm进程,不再增加或者减少;另一...
继续访问
php进程原理_PHP进程管理器php-fpm的工作原理
PHP进程管理器php-fpm的工作原理发布时间:2020-07-21 17:46:39来源:亿速云阅读:133作者:小新今天小编给大家分享的是PHP进程管理器php-fpm的工作原理,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧 。一定会有所收获的哦 。php-fpm是什么php-fpm是PHP的一个进程管理器 。php下面的众多work进程皆有php-fpm进程管...
继续访问
如何管理php常驻进程,一看就懂系列之 如何实现与控制php常驻进程-Go语言中文社区...
前言关于如何实现与控制php常驻进程,不管是google还是baidu上进行搜索,都没有感觉看起来赏心悦目的解答,于是决定自己动手总结下 。有同学会问了,整这个干甚?简单的说就是,可以让一个php脚本一直处于运行的状态 。从而实现将项目中某些耗时操作异步化,进队列后由php脚本取出再执行 。有同学又会问了 , 直接在服务器直接命令“php test.php ”,不就可以实现了?那么这样做的话有三点...
继续访问
PHP-FPM(PHP进程管理器)
PHP-FPM
继续访问
php 进程管理,从 0 到 1 优雅的实现 PHP 多进程管理
_| |_ __ __ _ _ __ _ _| |_ ___| '_ \ / _` | '__| | | | __/ _ \| | | | (_| | | | |_| | || (_) ||_| |_|\__,_|_| \__,_|\__\___/ .TIGERB.cnAn object-oriented multi process manager for PHPVersion: 0...
继续访问
php-fpm进程管理的三种模式
转载自 php-fpm解读-进程管理的三种模式 —程序媛大丽 标明转载以示尊重 感谢原作者的分享 。php-fpm进程管理一共有三种模式:ondemand、static、dynamic,我们可以在同一个fpm的master配置三种模式,看下图1 。php-fpm的工作模式和nginx类似,都是一个master , 多个worker模型 。每个worker都在accept本pool内的监听套接字(linu...
继续访问
php 进程管理那点事
之前本地开发和环境一直用的集成环境,最近新项目 集成了php7 nginx 跑了一段时间发现偶尔 有php进程退出的情况排查原因nginx log: 1111 upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after ...
继续访问
从0到1优雅的实现PHP多进程管理
_ | | _ __ __ _ _ __ _ _| |_ ___ | '_ \ / _` | '__| | | | __/ _ \ | | | | (_| | | | |_| | || (_) | |_| |_|\__,_|_| \__,_|\__\___/ ...
继续访问
热门推荐 php-fpm安装、配置与优化
转载自: 1、php中fastcgi和php-fpm是什么东西 最近在研究和学习php的性能方面的知识,看到了factcgi以及php-fpm , 发现我对他们是少之又少的理解,可以说几乎是一无所知,想想还是蛮可怕的 。决定仔细的学习一下关于这方面的知识 。参考和学习了以下文章: 1. mod_php和
继续访问
php-fpm的两种进程管理模式
php-fpm的两种进程管理模式 php-fpm的进程数也是可以根据设置分为动态和静态的 。一种是直接开启指定数量的php-fpm进程 , 不再增加或者减少; 另一种则是开始的时候开启一定数量的php-fpm进程 , 当请求量变大的时候,动态的增加php-fpm进程数到上限,当空闲的时候自动释放空闲的进程数到一个下限 。这两种不同的执行方式,可以根据服务器的实际需求来进行调整 。这里先说一下涉及
继续访问
7、Php-Fpm进程管理
1、进程管理 php-fpm采用的是master-worker的进程方式 。其中,master负责监听端口,等待链接;其次,注册信号,可以通过信息好master进行管理 worker负责处理具体的逻辑 如下图所示 2、信号管理 master进程可以理解如下信号 信号 含义 INT, TERM 立刻终止 ...
继续访问
php进程控制
简介 PHP的进程控制支持实现了Unix方式的进程创建, 程序执行, 信号处理以及进程的中断 。进程控制不能被应用在Web服务器环境,当其被用于Web服务环境时可能会带来意外的结果 。这份文档用于阐述每个进程控制函数的通常用法 。关于Unix进程控制的更多信息建议您查阅 系统文档中关于fork(2),waitpid(2),signal(2)等的部分或更全面的参考资料比如 《Unix环境高级编程》
继续访问
php进程管理
php 进程管理
【go语言中文论坛 go语言实战下载】go语言中文论坛的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于go语言实战下载、go语言中文论坛的信息别忘了在本站进行查找喔 。
推荐阅读
- python从html获取input数据,python读取html文件中的内容并输出
- python使用十进制输出金字塔,python输出*金字塔
- flutter怎么抽取公共布局,flutter 布局详解,必知必会
- 南通小程序商城开发功能,南通小程序商城开发功能怎么样
- oracle怎么复合索引 oracle复制表和索引
- 0粉丝公众号卖多少钱,公众号粉丝多少钱一个
- 2017年fps射击网络游戏,2018年射击游戏
- sqlserver2008企业版密钥,sql server 2016企业版密钥
- c语言所有函数解析 c语言各种函数用法举例