最近在测试服务器压力的时候,发现使用tornado的服务benchmark上不去,顶多1500左右,nginx即使开了8个进程,在响应请求的时候有一个work进程的cpu超高,达到100%的情况。
对于cpu超高的情况,当初我们都认为是2.6.18网卡中断只能在一个cpu上处理,导致cpu高,这虽然是一个原因,但是短期内升级整个系统是一个不太可能的事情。
鉴于官方说tornado性能很高,所以总觉得我们在某些地方使用有问题,看了nginx以及tornado的源码,发现有几个地方我们真没注意。
-
listen backlog,nginx默认的backlog是511,而tornado则是100,对于这种设置,如果并发量太大,因为backlog不足会导致大量的丢包。
将nginx以及tornado listen的时候backlog改大成20000,同时需要调整net.ipv4.tcp_max_syn_backlog,net.ipv4.tcp_timestamps,net.ipv4.tcp_tw_recycle等相关参数。
-
accept_mutex,将其设置为off,nginx默认为on,是为了accept的解决惊群效应,但是鉴于nginx只有8个进程,同时并发量大,每个进程都唤醒都能被处理,所以关闭。
做了上面简单的两个操作之后,ab benchmark发现nginx的cpu负载比较平均,同时不会出现upstream request timeout以及cannot assign requested address等错误。
同时,直接压tornado也第一次达到了4000的rps,通过nginx proxy到tornado则在3200左右。
虽然只是修改了几个配置,性能就提升了很多,后续对于nginx,还有很多需要研究的东西。
版权声明:自由转载-非商用-非衍生-保持署名 Creative Commons BY-NC-ND 3.0
题目:
Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
For example,
Given 1->4->3->2->5->2 and x = 3,
return 1->2->2->4->3->5.
分析:要注意head1==head2这种问题。
代码如下:
ListNode *partition(ListNode *head, int x) {
if(head==NULL)return head;
ListNode *head1=head;
if(head->val>=x)
{
while(head1->next!=NULL&&head1->next->val>=x)
{
head1=head1->next;
}
if(head1->next==NULL)
{
return head;
}
else
{
ListNode *tmp=head1->next;
head1->next=head1->next->next;
tmp->next=head;
head=tmp;
}
}
ListNode *head2=head;
while(head1->next!=NULL)
{
while(head1->next!=NULL&&head1->next->val>=x)
{
head1=head1->next;
}
if(head1->next==NULL)
{
return head;
}
if(head1==head2)
{
head1=head1->next;
head2=head2->next;
}
else
{
ListNode *tmp=head1->next;
head1->next=head1->next->next;
tmp->next=head2->next;
head2->next=tmp;
head2=tmp;
}
}
return head;
}
题目:
A message containing letters from A-Z is being encoded to numbers using the following mapping:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message "12",it could be decoded as "AB" (1 2) or
"L" (12).
The number of ways decoding "12" is 2.
分析:可以用贪心的思想,而且当前数字只与前面的数字有关。
代码如下:
int numDecodings(string s) {
int n=s.size();
if(n==0)return 0;
int *result=new int[n+1];
memset(result,0,(n+1)*sizeof(int));
result[0]=1;
for(int i=1;i<=n;i++)
{
if(s[i-1]!='0')
{
result[i]+=result[i-1];
}
if(i>=2&&s[i-1]-'0'+10*(s[i-2]-'0')<=26&&s[i-1]-'0'+10*(s[i-2]-'0')>=10)
{
result[i]+=result[i-2];
}
}
return result[n];
}