- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2014-12-26 15:26 编辑
windoze 发表于 2014-12-26 14:36 ![]()
回复 47# yulihua49
每个fiber 1M?每个fiber都是活动的?成千上万的session?如果真是这样的负载,你来 ...
每个fiber 1M不算多,我框架就用了530K。所有的fiber都会被激活,就是呼入的客户端迟早会耗尽所有的fiber,我们必须按这个设计。
你fiber的栈,什么时候分配?初始化时?呼入时?还释放吗?
rsp之上时用户区,之下是系统用,无论是原理上和实测结果都是毋容置疑的,X64,栈下不留足4K,必死。这是前几天测出来的。- uc->uc_stack.ss_size=save_stack_size+4096;
- uc->uc_stack.ss_sp=malloc(uc->uc_stack.ss_size+16);
- if(!uc->uc_stack.ss_sp) {
- uc->uc_stack.ss_size=0;
- uc=NULL;
- fcntl(socket,F_SETFL,fflag);
- continue;
- }
- //保存线程栈帧
- memcpy(uc->uc_stack.ss_sp+4096,(void *)(begin_stack-save_stack_size),save_stack_size);
- //将实际的rsp,rbp也调过来 这需要一段asm
- sp=set_sp(uc->uc_stack.ss_sp+4096);
复制代码 这是前几天的测试程序,本帖前边的代码是2048,会死,4096不会死。
split stack还没有看,是不是动态扩充的意思?即使如此,迟早会用到相当的尺寸。
如何节省栈,看38楼。
退一步,就算内存没问题,那TPC足矣,调度拥塞的问题可以用别的方法解决(我不会让1000个线程都动起来的),FPC就没必要了。
|
|