免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3295 | 回复: 7
打印 上一主题 下一主题

[C++] 我写的Redis3.0集群代理运行时CPU 100% [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-01 18:56 |只看该作者 |倒序浏览
31900 guoyinli  20   0  861m 7184  656 R 99.6  0.2  19:57.05 RedisClusterPro                                                                                            
31899 guoyinli  20   0  925m 9312  744 R 99.2  0.2  19:50.19 RedisClusterPro                                                                                            
31915 guoyinli  20   0  989m 5152  656 R 82.3  0.1  20:03.31 RedisClusterPro                                                                                            

采用多进程多线程架构:

1.Accept一个线程;

2.异步接收客户端数据和发送3个线程,接收数据后以List存储;

3.同步发送List数据到3台缓存服务器(根据key的哈希槽),并同步接收缓存服务器的数据存储于客户端socket的发送缓冲区,由第2步中的线程发送给客户端,

   这部分10个线程,每个线程维持3个缓存服务器的连接,同步接收发送数据;

4.动态配置信息更新1个线程.

相关事件控制用epoll_wait,List数据存取也有锁和信号控制,我就想不明白怎么每个进程CPU 差一点就100%?

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
2 [报告]
发表于 2015-07-01 19:16 |只看该作者
没代码猜起来好累

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
3 [报告]
发表于 2015-07-01 20:47 |只看该作者
list可以加锁,有没有这个尝试

论坛徽章:
0
4 [报告]
发表于 2015-07-02 09:17 |只看该作者
找到原因,动态配置信息更新线程以前是不停循环,现在改为1分钟刷新一次,CPU立马降到1%以下啦。

论坛徽章:
0
5 [报告]
发表于 2015-07-02 11:42 |只看该作者
客户端代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>

int main(int argc, char * argv[])
{
        struct sockaddr_in sAddr;
    int nConnectSocket;
    int nFlag = 1,nRet = 0;
        int nPort = 7777;
        char * sIP = "10.12.8.154";
        char sTempBuff[100] = {0};

    memset(&sAddr, 0, sizeof(sAddr));
    sAddr.sin_family = AF_INET;
    sAddr.sin_port = htons(nPort);
    sAddr.sin_addr.s_addr = inet_addr(sIP);
       
    for(int i = 1; i <100; i++)
    {
        sleep(1);
        if(fork() == 0) //子进程
        {
                        printf("Child process:%d\n",getpid());
            break;
        }
    }       

    nConnectSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (nConnectSocket < 0)
    {
                printf("New socket failed:%s!",strerror(errno));
        return -1;
    }
       
        if (connect(nConnectSocket,(struct sockaddr*)&sAddr, sizeof(sockaddr)) == -1)
        {
                printf("Connect redis server(%s:%d) failed:%s!",sIP,nPort,strerror(errno));
                close(nConnectSocket);
                return -1;
        }       
       
        sprintf(sTempBuff,"*2\r\n$6\r\nEXISTS\r\n$31\r\nt_cp_blacklist_user:13502399876\r\n");
       
        while (1)
        {
                nRet = send(nConnectSocket,sTempBuff,strlen(sTempBuff),0);
                if (nRet <= 0)
                {
                        printf("Send failed\n");
                        close(nConnectSocket);
                        break;
                }

                char recvBuff[100] = {0};
                nRet = recv(nConnectSocket,recvBuff,sizeof(recvBuff),0);
                if (nRet <= 0)
                {
                        printf("Recv failed\n");
                }
                else
                {
                        printf("Recv:%s\n",recvBuff);
                }
        }
       
        return 0;
}

论坛徽章:
0
6 [报告]
发表于 2015-07-02 11:44 |只看该作者
现在100个客户端进程并发访问,Redis集群代理TOP如下:

13302 guoyinli  20   0  989m 7280  688 S 48.7  0.2   2:09.95 RedisClusterPro                                                                                            
13301 guoyinli  20   0  989m 7368  776 S 48.1  0.2   3:38.57 RedisClusterPro                                                                                            
13317 guoyinli  20   0  989m 7248  660 S 47.7  0.2   2:19.76 RedisClusterPro

客户端TOP:

6687 acs       15   0 11428  344  212 S  0.6  0.0   0:01.55 ClientTest                                                                                                
6700 acs       15   0 11428  344  212 S  0.6  0.0   0:01.20 ClientTest                                                                                                
6714 acs       15   0 11428  344  212 S  0.6  0.0   0:01.01 ClientTest                                                                                                
6745 acs       15   0 11428  344  212 S  0.6  0.0   0:00.84 ClientTest                                                                                                
6751 acs       15   0 11428  344  212 S  0.6  0.0   0:00.94 ClientTest                                                                                                
6768 acs       15   0 11428  344  212 S  0.6  0.0   0:00.94 ClientTest                                                                                                
6776 acs       15   0 11428  344  212 S  0.6  0.0   0:00.80 ClientTest                                                                                                
6785 acs       15   0 11428  344  212 S  0.6  0.0   0:00.82 ClientTest                                                                                                
3220 mgoms     24   0  282m 6908 3956 S  0.3  0.0   0:22.74 bas_router                                                                                                
6674 acs       15   0 11428  944  816 S  0.3  0.0   0:00.56 ClientTest                                                                                                
6675 acs       15   0 11428  344  212 S  0.3  0.0   0:01.79 ClientTest                                                                                                
6677 acs       15   0 11428  344  212 S  0.3  0.0   0:01.74 ClientTest                                                                                                
6678 acs       15   0 11428  344  212 S  0.3  0.0   0:01.61 ClientTest                                                                                                
6682 acs       15   0 11428  344  212 S  0.3  0.0   0:01.54 ClientTest                                                                                                
6683 acs       15   0 11428  344  212 S  0.3  0.0   0:01.34 ClientTest                                                                                                
6684 acs       15   0 11428  344  212 S  0.3  0.0   0:01.40 ClientTest                                                                                                
6685 acs       15   0 11428  344  212 R  0.3  0.0   0:01.47 ClientTest                                                                                                
6686 acs       15   0 11428  344  212 S  0.3  0.0   0:01.60 ClientTest                                                                                                
6688 acs       15   0 11428  344  212 S  0.3  0.0   0:01.39 ClientTest                                                                                                
6692 acs       15   0 11428  344  212 S  0.3  0.0   0:01.20 ClientTest                                                                                                
6693 acs       16   0 11428  344  212 S  0.3  0.0   0:01.26 ClientTest                                                                                                
6694 acs       15   0 11428  344  212 S  0.3  0.0   0:01.16 ClientTest                                                                                                
6696 acs       15   0 11428  344  212 S  0.3  0.0   0:01.05 ClientTest                                                                                                
6697 acs       15   0 11428  344  212 S  0.3  0.0   0:01.17 ClientTest                                                                                                
6698 acs       16   0 11428  344  212 S  0.3  0.0   0:01.13 ClientTest                                                                                                
6701 acs       15   0 11428  344  212 S  0.3  0.0   0:01.00 ClientTest                                                                                                
6704 acs       15   0 11428  344  212 S  0.3  0.0   0:01.01 ClientTest                                                                                                
6708 acs       15   0 11428  344  212 S  0.3  0.0   0:01.30 ClientTest                                                                                                
6710 acs       15   0 11428  344  212 S  0.3  0.0   0:00.91 ClientTest                                                                                                
6712 acs       15   0 11428  344  212 S  0.3  0.0   0:00.91 ClientTest                                                                                                
6715 acs       15   0 11428  344  212 S  0.3  0.0   0:01.20 ClientTest                                                                                                
6717 acs       15   0 11428  344  212 S  0.3  0.0   0:01.15 ClientTest                                                                                                
6718 acs       15   0 11428  344  212 S  0.3  0.0   0:01.06 ClientTest                                                                                                
6719 acs       15   0 11428  344  212 S  0.3  0.0   0:00.97 ClientTest

论坛徽章:
0
7 [报告]
发表于 2015-07-02 11:46 |只看该作者
服务端配置:

IP = 10.12.8.154
Port = 7777
ProcessNum = 3
IOThreadNum = 3
ProxyThreadNum = 10

RedisSlotNum = 16384
RedisSlotDist = 10.12.8.154:6379(10923-16383);10.12.8.155:6379(5461-10922);10.12.8.156:6379(0-5460);
SendTimeOut = 1500
RecvTimeOut = 1500
SocketTimeOut = 300000
LogLevel = 7

论坛徽章:
0
8 [报告]
发表于 2015-07-13 12:28 |只看该作者
相关代码见博客户园cnblogs.com/guoyinglin/p/4604279.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP