自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 JVM调优实战

所以直接关闭UseAdaptiveSizePolicy,并且通过-XXSurvivorRatio=N把Survivor区域调整到一定的大小(500M-1G,越大的话浪费的内存也相对多一些,不过都10G了,也不在乎那一点内存了),Eden区域比例不可过大,否则minorGC耗时也会上去,也不可过小,太频繁的话,GC过程本身也有一定的耗时,积少成多,吞吐也自然会下降。老年代7G,会发生多次FullGC,说明老年代的内存慢慢上涨,但是不是内存泄漏,因为如果是内存泄漏,FullGC完应该会OOM。.........

2022-07-30 08:18:59 1558 3

原创 php exit codes说明

php exit code number 说明

2022-07-14 14:56:37 307

原创 java NIO Selector惊群现象研究

序言:本文讨论的问题都是基于JDK8的版本在使用java的NIO实现一个server之前,本人也有接触过c/c++/php的server实现,在“单进程单线程”下,本身是串行的,也无需讨论“惊群问题”,在“多进程单线程” 模式下(以php为例),一般是在主进程中创建好server socket、绑定好端口等操作,然后fork出多个worker进程(每个worker进程都会accept连接),父子进程间因fork有“写时复制机制”的存在,可以共用同一个端口下的server socket,当有客户端连.

2022-05-20 12:15:28 516

原创 php opcache工作原理简要描述

php opcache工作过程及其使用的共享内存追踪

2022-03-02 16:07:19 452 1

原创 vscode开发php时,在注释内也能代码提示的配置

作者用的代码只能提示插件:phpintelephensevscode打开settings.json, 写入关键配置"editor.quickSuggestions": { "other": true, "comments": true, "strings": true}此时在代码注释块中,@return @property @var @param 等后面定义字段类型时,都能进行代码提示了,默认配置, 注释或注释块中是无法进行代码智能提示的...

2021-10-26 10:03:30 895

原创 操作PDO查询结果集时,实现IDE的代码智能提示

在我们的业务代码中操作MySQL时,通常使用PDO查询出结果之后都是关联数组列表,无论是使用foreach还是直接操作获取的单条record,phpstorm都无法自动代码提示。其实有一个比较讨巧的方法。核心方法: PDO::setFetchMode,ide注释中加上自定义类型<?php//以下只是代码示例,无法直接运行$pdo = new PDO(...);$stmt = $pdo->prepare("select * from `user`");$stmt-&gt.

2021-08-18 16:53:41 86

原创 ab压测Http Server时TCP连接TIME_WAIT状态研究

当ab压测工具和http server在同一台(centos)机器时,为何不会出现端口不够用的情况呢?假设压测参数如下:ab -n100000 -c5000 http://localhost我们都知道tcp有四元组的概念,server_ip:server_port <=> client_ip:client_port,对于server端,只需要一个固定端口,而client端每个连接需要使用不同的随机端口,在linux下随机端口是有限的,执行命令查看:cat /proc/sys/n.

2021-07-12 18:57:22 596 1

原创 MySql优化总结

Innodb 关键配置参数innodb_lock_wait_timeout = 5 # 默认50innodb_io_capocity = 5000 #该参数设置和磁盘IOPS相关innodb_buffer_pool_size = 4Ginnodb_buffer_pool_instances = 1innodb_log_buffer_size = 512Minnodb_flush_log_at_trx_commit = 1max_connections = 10000…待补充...

2021-06-22 17:35:02 78

原创 php实现代码量最少的权重随机算法

<?phpfunction rolling(): array { $conf = [ ['id'=> 1,'weight'=>80], ['id'=> 2,'weight'=>10], ['id'=> 3,'weight'=>7], ['id'=> 4,'weight'=>2], ['id'=> 5,'weight'=>1] ]; $total = 0; foreach($con.

2021-06-16 16:36:08 344 2

原创 vagrant下搭建nginx+php-fpm ab压测qps非常低的问题

最近笔者用vagrant安装了centos7系统,用了vagrant自带的文件夹共享挂载,为了方便开发调试项目都是放在映射的文件夹中,nginx配置的路径也是指向这里,可是

2021-06-01 09:32:57 338

原创 关于保证用户级的队列数据按顺序消费且能扩容的思考

队列中的一条数据,在文中都称为一个“任务”对于指定的用户uid_a,假设它的异步任务数据都入队列queue_a, 但是有N个消费线程从queue_a pop数据去消费,那么每条任务的执行顺序是未知的,假设任务A、B、C 执行业务分别为insert,update,delete,一旦顺序无法保障,假设变成delete,insert,update,产生的结果截然不同,本该删除的数据,但是缺保留了下来。还有很多类似的场景,对于同一个用户的不同任务间有顺序依赖性的场景。 本文就是探讨该场景下的解决方案..

2021-05-09 00:10:49 234

原创 基于swoole开发一个类似ab的压测工具

压测工具如下:<?phpuse Swoole\Coroutine\Channel;use Swoole\Coroutine\Http\Client;/** * Created by PhpStorm. * User: randy * Date: 2021/3/11 */class Benchmark{ private static $concurrentInfo = []; /** * 本轮压测持续时长,单位: 秒 * @var i.

2021-03-11 18:17:10 199

原创 关于一个http请求和数据库IO代码顺序导致api接口qps性能差异的思考

引出问题如下: 当一个基于http协议的papi接口中,有发起对第三方http接口的调用,且有多次数据库IO时,http请求代码放最前面和最后面性能有差异吗? 前提如下: # 数据库有连接池,数量假设100, ab压测并发的客户端数为2000,即(ab -c2000 ) # 使用Swoole协程http server。php代码如下:<?php<?php/** * Created by PhpStorm....

2021-02-25 20:44:19 277 1

原创 基于swoole开发高性能restful api服务器的一些思考

关于协程:协程:其实就是用户态的线程,关于swoole协程的切换机制可以参考我的另外一篇文章swoole协程切换机制 swoole从4.x版本开始后,加入了协程的特性,用法上和golang很相似,对于普通写业务的phper来说,基本上和写同步代码没什么区别。很多人都使用协程来写server代码,但是当你认真思考生产实际环境时,你会发现一些问题: # swoole官方提供的数据库协程客户端只有:redis、mysql。当项目中使用了其他的数据库客户端时,堵塞IO就无法h...

2021-02-24 10:49:04 438

原创 swoole源码解读之协程切换机制

最近一段时间,突然想研究一下swoole底层的协程切换机制,一方面可以对swoole更加了解,然后有可以加深php扩展开发的一些知识,最后是为了提升c/c++技能至于探索整个协程机制的细节就不讨论了,下面直接列出协程切换的核心要点hook 系统API的socket系列函数,替换成swoole自己封装的socket api,这样可以加入协程的yield() 逻辑 源码路径: include > swoole_socket_hook.h#ifdef __cpluspl...

2021-02-04 21:37:12 510

原创 visual studio code皮肤字体设置

1、在vscode的安装目录中寻找:/app/extensions/theme-defaults/themes/dark_plus.json2、将如下json内容复制到dark_plus.json中{ "name": "One Monokai", "type": "dark", "colors": { "activityBar.background": "#2F333D", "activityBar.foreground": "#D7DAE0", "a..

2021-01-25 11:54:44 842 1

原创 并发编程在Java和c++中的高度概括

Java: synchronized 用法 volatile 用法 ThreadLocal 用法 Executor 用法 Atomic package用法 主动的使用Lock Future ThreadPoolExecutor 线程池 几个并发集合类型的用法 遵循JVM happens before 原则 重要知识点:因为“cpu缓存” 导致的“伪共享”、编译器执行指令优化导致的重排序(re...

2021-01-13 16:22:25 229

原创 谈一谈TimeWheel算法删除空闲连接

Time Wheel的具体算法原理,可以参考网络上的资料,本文不探讨具体的原理。在多数的网络库中,要删除空闲的连接,都会使用Time Wheel 时间轮算法。在不做任何优化的情况下,如果所有的TCP连接对象都存储在$connection_list数组中,那边要删除空闲连接,常规的伪代码大致如下<?phpClass Connection { private $fd; //最近一次收到消息的时间戳 public $lastRecvTime; //每次连接onMes.

2021-01-11 18:13:20 193

原创 执行socket的write方法之后,立刻close连接,对方是否能成功收到数据呢?

最近在看 《linux多线程服务端编程:使用moduo C++网络库》一书中,看到一段话“如果要主动关闭连接,如何保证对方已经收到全部数据?如果应用层有缓冲(这在非阻塞网络编程中是必需的,见下文),那么如何保证先发送完缓冲区中的数据,然后再断开连接?直接调用close(2)恐怕是不行的。”摘录来自: 陈硕. “Linux多线程服务端编程:使用muduo C++网络库。”往socket连接中write数据,其实先到write buffer之中的,如果是非堵塞IO write操作会立刻返回,此.

2021-01-08 15:38:32 1758 4

原创 Mysql千万级数据SQL查询性能注意要点

本文主要目的是关于mysql千万级数据量以后,sql查询注意要点。笔者所用的mysql版本为8.0, follow关注表数据量2kw, 数据库引擎为Innodb1、select count(*) ,select count(1) , select count(`id`) 在表千万级以上时,都比较慢,所以尽量少用2、不要在包含not in或者in的SQL语句上使用max(`id`) 或者min(`id`),否则必然慢查询 desc或explain的结果只作为...

2020-12-18 10:10:14 486

原创 linux下对磁盘读写速度压测

time dd if=/dev/zero of=/test.disk bs=8k count=300000

2020-12-10 14:50:59 478

原创 压测比对Swoole tcp协程池和单个non blocking tcp客户端

php socket通讯作为推流使用,基本上没办法跑满网卡。只有c++这种静态语言能接近跑满网卡

2020-12-07 21:26:32 270

原创 关于Swoole协程容器

要使用协程的API,必须在协程容器中,那么怎么样才算创建一个协程容器呢?最外层go闭包内,或者\Co\Run()闭包内,都算创建了协程序容器<?phpgo(function(){ //此处用\Co\Run效果一样的//在当前闭包内,就算协程环境了,一般情况下,根协程cid = 1 for ($i=0;$i<10;$i++) { go(function(){ //子协程环境 }) } //此处必须等所有子协程环境执行完成}.

2020-12-05 11:18:44 327

原创 谈一谈生产环境中swoole协程创建数量控制机制

在swoole官方文档中,有提及“协程开销”。简单引用如下:在PHP-7.2版本中底层会分配8K的stack来存储协程的变量,zval的尺寸为16字节,因此8K的stack最大可以保存512个变量。协程栈内存占用超过8K后ZendVM会自动扩容。 PHP-7.1、PHP-7.0默认会分配256K栈内存 本文以php7.2为例,因为笔者当前使用的php版本也是7.2。为了验证php7.2中,创建一个协程是否默认为8K,可以写个demo简单测试...

2020-10-16 11:11:00 2014

原创 谈一谈PHP变量或参数的Copy On Write机制

关于php的copy on wirte(写时复制) 特性,本文不做研究,可以参考官方文档了解在php中标量数据类型(int 、float、bool、string)加上array这些类型作为函数或者类方法的参数时,默认都是按值传递的。但是对象(object) 例外,在php5以后,object默认按引用传递。(但是不完全等于&引用传递),总结来说对象参数重新new构造一个全新的时候,会发生copy on write,而&引用传参,都是指向同一个内存空间,不会发生copy on w...

2020-10-13 20:56:50 248 1

原创 Clion下c++ library开发CMake使用指引

正常的c++可执行程序,都是一个CMakelists.txt就可以搞定的,而且clion默认就可以run + debug, 但是当我们要开发一个library时,就需要对这个library进行使用测试,默认的library不是executable,无法直接在clion中run或者debug的。本文涵盖的另外一个点就是:Clion下一个project如何跑多个可执行文件1、首先我们通过Clion新建一个C++ library项目, 此时ide会自动创建根目录下的CMakelists.txt文件,此.

2020-10-12 15:45:36 3043 2

原创 centos快速升级gcc8

sudo yum install centos-release-sclsudo yum install devtoolset-7-gcc*scl enable devtoolset-7 bashwhich gccgcc --version

2020-09-08 15:15:17 248

原创 C++ 写基于http的API接口用什么库

boost的beast库,推荐!!! The GNU libmicrohttpd Library (http://www.gnu.org/software/libmicrohttpd/manual/libmicrohttpd.html) cinatra(https://www.cnblogs.com/tianshifu/p/8410791.html)

2020-08-14 15:00:19 957 1

原创 Jenkins 发布PHP项目代码

基于Jenkins发布php代码,其实核心就是三个插件git/svn 插件 Push Over SSH 插件 Role-based Authorization Strategy(该插件就是用于管理多项目时,用户权限分配,不同的角色控制不同项目)网络上的资料,基本都是介绍如何配置的图例教程,但是本文章不介绍这些,关于配置资料已经很多了,本文章的目的是让大家了解整个发布过程。安装jenkins的服务器本文称为:发布机器运行项目代码的服务器本文称为:项目机器jenkins就是基于 ...

2020-08-13 10:12:47 529

原创 MySQL InnoDB锁知识点

摘要: 普通select 语句都不会加锁,底层使用 "快照读" 技术, 快照读就是发生写操作时copy一个数据的新副本,其他读操作read旧版本数据,这里采用 “多数据版本”来实现。 会加锁的特殊select语句: select ... lock in share mode select ... for update update、delete 默认加“排它锁(X)”, insert有概率加“插入意向锁”(gap锁的一种) 并发 Insert 也有概率出现...

2020-07-24 16:30:05 90

原创 聊聊swoole或者php cli 进程如何热重启

在讨论这个话题之前,需要了解一下linux的信号,在linux中发起一个信号最常用的函数莫过于kill了,如 kill -SIGUSR1 pid、kill -9 pid 、kill -SIGTERM pid 等等。这些都属于软中断进程在收到这些信号之后,默认的处理行为,就是不管三七二十一直接退出进程, 这时候如果进程正在处理业务数据,那么不好意思,直接就没了。所以该怎么处理呢?核心步骤注册信号处理函数,去拦截监听进程收到的信号,改变进程默认的处理行为 在业务层代码,做一个标记状态,当状...

2020-07-22 17:06:07 487

原创 php进程间传递文件描述符

#进程间传递文件描述符有什么实际应用场景呢?- 最近看到golang中关于服务器平滑热重启reload时,需要长链接不被断开,需要fork一个子进程出来,然后把父进程的所有socket的文件 描述符(即:所有hold的客户端连接)都传递到子进程。在没研究linux进程间传递文件描述符之前,我的脑海里只有fork时,发生copy-on-write,父子进程间直接就可以共享连接fd了,但是这个时候,如果父进程退出,那所有的连接也被掐断了,因为父子进程共享连接资源了。所以需要将fd关联到的资源完整的clon..

2020-07-01 17:09:47 411

原创 php中使用google protobuf协议环境配置

网络上很多文章误导人,说安装了php-protobuf扩展,然后还让人去composer install加载,纯属误导,扩展和composer方式二选一就可以了安装了扩展就不需要comoser,要使用composer就不用安装扩展

2020-04-03 16:00:04 513

原创 php中使用Makefile编译protobuf协议文件

Makefile WORK_DIR=$(shell pwd)PROTO_FILES=$(WORK_DIR)/Application/Protofiles/*.protoPHP_OUT_DIR=$(WORK_DIR)/Application/Protocols/.PHONY: msgmsg: @echo build begin protoc -I=$(WORK_DI...

2020-04-03 15:14:10 315

原创 php socket通信中stream_select方法的理解

stream_select 判断连接可读可写判断连接是否断开

2017-08-03 18:51:49 4842

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除