当前位置: 首页 > news >正文

明星个人网站建设方案开发一个电商平台app要多少钱

明星个人网站建设方案,开发一个电商平台app要多少钱,重庆渝中区企业网站建设联系电话,海口免费网站建站模板历史原因#xff0c;一直使用 libev 作为服务底层#xff1b;异步框架虽然性能比较高#xff0c;但新人学习和使用门槛非常高#xff0c;而且串行的逻辑被打散为状态机#xff0c;这也会严重影响生产效率。用同步方式实现异步功能#xff0c;既保证了异步性能优势#x…历史原因一直使用 libev 作为服务底层异步框架虽然性能比较高但新人学习和使用门槛非常高而且串行的逻辑被打散为状态机这也会严重影响生产效率。用同步方式实现异步功能既保证了异步性能优势又使得同步方式实现源码思路清晰容易维护这是协程的优势。带着这样的目的学习微信开源的一个轻量级网络协程库libco 。1. 概述libco 是轻量级的协程库看完下面几个帖子应该能大致搞懂它的工作原理。2. 问题带着问题学习 libco搞清这几个概念阻塞非阻塞同步异步锁。协程是什么东西与进程和线程有啥关系。协程解决了什么问题。协程在什么场景下使用。协程切换原理。协程切换时机。协程需要上锁吗libco 主要有啥功能。(协程管理epoll/keventhook)3. libco 源码结构布局将 libco 的源码结构展开这样方便理清它的内部结构关系。4. mysql 测试测试目标测试 libco 协程性能以及是否能将 mysqlclient 同步接口进行异步改造。测试系统CentOS Linux release 7.7.1908 (Core)测试源码github。4.1. 测试源码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758/* 数据库信息。 */typedef struct db_s {std::string host;int port;std::string user;std::string psw;std::string charset;} db_t;/* 协程任务。 */typedef struct task_s {int id; /* 任务 id。 */db_t* db; /* 数据库信息。 */MYSQL* mysql; /* 数据库实例指针。 */stCoRoutine_t* co; /* 协程指针。 */} task_t;/* 协程处理函数。 */void* co_handler_mysql_query(void* arg) {co_enable_hook_sys();.../* 同步方式写数据库访问代码。 */for (i 0; i g_co_query_cnt; i) {g_cur_test_cnt;/* 读数据库 select。 */query select * from mytest.test_async_mysql where id 1;;if (mysql_real_query(task-mysql, query, strlen(query))) {show_error(task-mysql);return nullptr;}res mysql_store_result(task-mysql);mysql_free_result(res);}...}int main(int argc, char** argv) {.../* 协程个数。 */g_co_cnt atoi(argv[1]);/* 每个协程 mysql query 次数。 */g_co_query_cnt atoi(argv[2]);/* 数据库信息。 */db new db_t{127.0.0.1, 3306, root, 123456, utf8mb4};for (i 0; i g_co_cnt; i) {task new task_t{i, db, nullptr, nullptr};/* 创建协程。 */co_create((task-co), NULL, co_handler_mysql_query, task);/* 唤醒协程。 */co_resume(task-co);}/* 循环处理协程事件逻辑。 */co_eventloop(co_get_epoll_ct(), 0, 0);...}5. hook在 Centos 系统查看 hook 是否成功除了测试打印日志其实还有其它比较直观的方法。5.1. strace用 strace 查看底层的调用我们看到 mysql_real_connect 内部的 connect被 hook 成功connect 前被替换为 libco 的 connect 了。socket 在 connect 前被修改为 O_NONBLOCK 。12345# strace -s 512 -o /tmp/libco.log ./test_libco 1 1socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) 4fcntl(4, F_GETFL) 0x2 (flags O_RDWR)fcntl(4, F_SETFL, O_RDWR|O_NONBLOCK) 0connect(4, {sa_familyAF_INET, sin_porthtons(3306), sin_addrinet_addr(127.0.0.1)}, 16) -1 EINPROGRESS (Operation now inprogress)5.2. gdb上神器 gdb在 co_hook_sys_call.cpp 文件的 read 和 write 函数下断点。命中断点查看函数调用堆栈libco 在 Centos 系统能成功 hook 住 mysqlclient 的阻塞接口。12345678910#0 read (fdfdentry9, bufbufentry0x71fc30, nbytenbyteentry19404) at co_hook_sys_call.cpp:299#1 0x00007ffff762b30a in read (__nbytes19404, __buf0x71fc30, __fd9) at /usr/include/bits/unistd.h:44#2 my_read (FiledesFiledesentry9, BufferBufferentry0x71fc30 , CountCountentry19404, MyFlagsMyFlagsentry0)at /export/home/pb2/build/sb_0-37309218-1576675139.51/rpm/BUILD/mysql-5.7.29/mysql-5.7.29/mysys/my_read.c:64#3 0x00007ffff7624966 in inline_mysql_file_read (src_file0x7ffff78424b0 /export/home/pb2/build/sb_0-37309218-1576675139.51/rpm/BUILD/mysql-5.7.29/mysql-5.7.29/mysys/charset.c,src_line383, flags0, count19404, buffer0x71fc30 , file9)at /export/home/pb2/build/sb_0-37309218-1576675139.51/rpm/BUILD/mysql-5.7.29/mysql-5.7.29/include/mysql/psi/mysql_file.h:1129#4 my_read_charset_file (loaderloaderentry0x7ffff7ed7270, filenamefilenameentry0x7ffff7ed7320 /usr/share/mysql/charsets/Index.xml,myflagsmyflagsentry0) at /export/home/pb2/build/sb_0-37309218-1576675139.51/rpm/BUILD/mysql-5.7.29/mysql-5.7.29/mysys/charset.c:3836. 压测结果从测试结果看单进程单线程多个协程是“同时”进行的“并发”量也随着协程个数增加而增加跟测试预期一样。这里只测试协程的”并发性”实际应用应该是用户比较多每个用户的 sql 命令比较少的。1234567891011121314# ./test_libco 1 10000id: 0, testcnt: 10000, cur spend time: 1.778823total cnt: 10000, total time: 1.790962, avg: 5583.591448# ./test_libco 2 10000id: 0, testcnt: 10000, cur spend time: 2.328348id: 1, testcnt: 10000, cur spend time: 2.360431total cnt: 20000, total time: 2.373994, avg: 8424.620726# ./test_libco 3 10000id: 0, testcnt: 10000, cur spend time: 2.283759id: 2, testcnt: 10000, cur spend time: 2.352147id: 1, testcnt: 10000, cur spend time: 2.350272total cnt: 30000, total time: 2.370038, avg: 12658.0247197. mysql 连接池用 libco 共享栈简单造了个连接池在 Linux 压力测试单进程 10w 个协程每个协程读 10 个 sql 命令(相当于 1000w 个包)并发处理能力 8k/s在可接受范围内。12# ./test_mysql_mgr r 100000 10total cnt: 1000000, total time: 125.832877, avg: 7947.048692压测源码(github)。mysql 连接池简单实现(github)。压测发现每个 mysql 连接只能独立运行在固定的协程里否则大概率会出现问题。libco hook 技术虽然将 mysqlclient 阻塞接口设置为非阻塞但是每个 mysqlclient 连接必须一次只能处理一个命令像同步那样非阻塞只是方便协程切换到其它空闲协程进行工作充分利用原来阻塞等待的时间。而且 mysqlclient 本来就是按照同步的逻辑来写的一个连接一次只能处理一个包不可能被你设置为非阻塞后一次往 mysql server 发 N 个包这样肯定会出现不可预料的问题。libco 协程切换成本不高主要是 mysqlclient 耗费性能参考火焰图。压测频繁地申请内存空间也耗费了不少性能(参考火焰图的 __brk)尝试添加 jemalloc 优化发现 jemalloc 与 libco 一起用在 Linux 竟然出现死锁8. 小结通过学习其他大神的帖子走读源码写测试代码终于对协程有了比较清晰的认知。测试 libcoCentos 功能正常但 MacOS 下不能成功 Hook 住 mysqlclient 阻塞接口。libco 是轻量级的它主要应用于高并发的 IO 密集型场景所以你看到它绑定了多路复用模型。虽然测试效果不错如果你考虑用 libco 去造一个 mysql 连接池还有不少工作要做。libco 很不错所以我选择 golang 。9. 参考
http://www.zqtcl.cn/news/23129/

相关文章:

  • 北师大网页制作与网站建设期末考试北京搬家公司口碑排行电话
  • 湘潭网站网站建设网站开发算法面试
  • 笔记本销售网站开发的背景网站建设切片效果是什么
  • 广州万网建网站医院网络销售要做什么
  • 新建网站建设域名备案查询接口
  • 展览设计网站有哪些网站应该设计成什么样
  • 怎么搞自己的网站关于做旅游网站的参考文献
  • 网站域名账号如何推广产品
  • 备案掉了网站会怎样wordpress搜索慢怎么解决
  • 自己做一个商城网站怎么做seo的工作流程
  • 网站制作的网站做自己卖东西的网站
  • 网站建设专家如何选做网站做论坛赚钱吗
  • 长沙网站制作公司推荐品牌网站建设荐选蝌蚪
  • 网站建设客户优化营商环境存在问题及整改措施
  • 七冶建设集团网站 江苏基于wordpress个人博客网站论文
  • 毕设 网站开发的必要性建设网站招标
  • 如何对网站建设和维护在家做兼职官方网站平台
  • 农产品的网站建设方案以及范文西安seo外包行者seo
  • 一个企业建设网站的目的明天正式解封
  • iis怎么让添加的网站没有端口网络推广方案100例
  • 网站编程员工资网站建设字体变色代码
  • 微信与网站对接seo优化工作内容做什么
  • 怎么弄百度网站网站上传用什么软件做视频格式
  • 做网站图片如何压缩图片wordpress主题免费分享
  • 把国外的网站翻译过来做自媒体上海专业排名优化公司
  • 深圳最好的营销网站建设公司档案馆网站机房建设
  • 如何制作自己的网站二维码建设网站需要准备什么资料
  • 自助建站实验报告包头学做网站
  • 网站设计心得体会域名注册需要资料
  • 做网站的体会网站建设售后