Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

散列分配任务给worker不均匀 #28

Open
edcismybrother opened this issue Nov 19, 2018 · 3 comments
Open

散列分配任务给worker不均匀 #28

edcismybrother opened this issue Nov 19, 2018 · 3 comments

Comments

@edcismybrother
Copy link

散列逻辑只会将任务平均分配到固定的几个worker中去执行,很多worker都是闲置的
写了一个demo,大概意思是将10000个任务分配到50个worker当中
m := make(map[uint32]uint32, 0)
for i := 0; i < 10000; i++ {
var a = uint64(i)
aa := &a
b := (*[4]byte)(unsafe.Pointer(aa))
// fmt.Println(*b)
h := fnv.New32a()
h.Write((*b)[:])
code := h.Sum32()
// fmt.Println(code)
workID := code & uint32(50)
// fmt.Println(workID)
m[workID]++
}
for k, v := range m {
fmt.Printf("k=%v,v=%v\n", k, v)
}
实际效果是50个worker只用到了其中的8个,其他42个都是闲置的
k=48,v=1251
k=18,v=1250
k=16,v=1249
k=0,v=1249
k=50,v=1250
k=34,v=1250
k=32,v=1251
k=2,v=1250
demo中的代码是根据tao框架的散列逻辑写的,demo很简单不知道有没有漏掉什么,如果没有,那这个worker分配就有问题了。

@leesper
Copy link
Owner

leesper commented Nov 20, 2018

@edcismybrother 我按散列分配到worker的逻辑不是为了平均分配哈,是为了按netid分配到不同的worker中,虽然线程池是并发处理多个任务的,但是对于一个netid而言,它必须是串行的——客户端发送过来的请求,必须按照到达的顺序来处理,如果后到的请求先被空闲线程处理了,那么必然导致业务逻辑时序混乱问题,比如获取用户信息的请求先于登录请求到达,就会出错,从多个用户的角度看它是并行的,但从单个用户的角度看,它应该是“串行”的。不过你说的这个问题我会认真研究的,我觉得可以在算法上改进下,让它能做到尽量公平分配,同时又能按序处理单个用户请求,谢谢你的宝贵意见,我们保持联系,多交流!:)

@edcismybrother
Copy link
Author

感谢大佬的回复,刚刚又看了下代码,一个客户端发出的多个消息的确是在同一个worker中按顺序执行,之前没有考虑到消息顺序的问题,大意了

@leesper
Copy link
Owner

leesper commented Nov 20, 2018

@edcismybrother 并不是什么大佬哈,只是一个普通的Coder而已,网络编程的东西还是很多的,我觉得我们都要好好研究下别的产品级框架是怎么写的,比如陈硕老师的muduo框架,还有netty框架~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants