- 浏览: 2685721 次
- 来自: 杭州
-
文章分类
- 全部博客 (1188)
- webwork (4)
- 网摘 (18)
- java (103)
- hibernate (1)
- Linux (85)
- 职业发展 (1)
- activeMQ (2)
- netty (14)
- svn (1)
- webx3 (12)
- mysql (81)
- css (1)
- HTML (6)
- apache (3)
- 测试 (2)
- javascript (1)
- 储存 (1)
- jvm (5)
- code (13)
- 多线程 (12)
- Spring (18)
- webxs (2)
- python (119)
- duitang (0)
- mongo (3)
- nosql (4)
- tomcat (4)
- memcached (20)
- 算法 (28)
- django (28)
- shell (1)
- 工作总结 (5)
- solr (42)
- beansdb (6)
- nginx (3)
- 性能 (30)
- 数据推荐 (1)
- maven (8)
- tonado (1)
- uwsgi (5)
- hessian (4)
- ibatis (3)
- Security (2)
- HTPP (1)
- gevent (6)
- 读书笔记 (1)
- Maxent (2)
- mogo (0)
- thread (3)
- 架构 (5)
- NIO (5)
- 正则 (1)
- lucene (5)
- feed (4)
- redis (17)
- TCP (6)
- test (0)
- python,code (1)
- PIL (3)
- guava (2)
- jython (4)
- httpclient (2)
- cache (3)
- signal (1)
- dubbo (7)
- HTTP (4)
- json (3)
- java socket (1)
- io (2)
- socket (22)
- hash (2)
- Cassandra (1)
- 分布式文件系统 (5)
- Dynamo (2)
- gc (8)
- scp (1)
- rsync (1)
- mecached (0)
- mongoDB (29)
- Thrift (1)
- scribe (2)
- 服务化 (3)
- 问题 (83)
- mat (1)
- classloader (2)
- javaBean (1)
- 文档集合 (27)
- 消息队列 (3)
- nginx,文档集合 (1)
- dboss (12)
- libevent (1)
- 读书 (0)
- 数学 (3)
- 流程 (0)
- HBase (34)
- 自动化测试 (1)
- ubuntu (2)
- 并发 (1)
- sping (1)
- 图形 (1)
- freemarker (1)
- jdbc (3)
- dbcp (0)
- sharding (1)
- 性能测试 (1)
- 设计模式 (2)
- unicode (1)
- OceanBase (3)
- jmagick (1)
- gunicorn (1)
- url (1)
- form (1)
- 安全 (2)
- nlp (8)
- libmemcached (1)
- 规则引擎 (1)
- awk (2)
- 服务器 (1)
- snmpd (1)
- btrace (1)
- 代码 (1)
- cygwin (1)
- mahout (3)
- 电子书 (1)
- 机器学习 (5)
- 数据挖掘 (1)
- nltk (6)
- pool (1)
- log4j (2)
- 总结 (11)
- c++ (1)
- java源代码 (1)
- ocr (1)
- 基础算法 (3)
- SA (1)
- 笔记 (1)
- ml (4)
- zokeeper (0)
- jms (1)
- zookeeper (5)
- zkclient (1)
- hadoop (13)
- mq (2)
- git (9)
- 问题,io (1)
- storm (11)
- zk (1)
- 性能优化 (2)
- example (1)
- tmux (1)
- 环境 (2)
- kyro (1)
- 日志系统 (3)
- hdfs (2)
- python_socket (2)
- date (2)
- elasticsearch (1)
- jetty (1)
- 树 (1)
- 汽车 (1)
- mdrill (1)
- 车 (1)
- 日志 (1)
- web (1)
- 编译原理 (1)
- 信息检索 (1)
- 性能,linux (1)
- spam (1)
- 序列化 (1)
- fabric (2)
- guice (1)
- disruptor (1)
- executor (1)
- logback (2)
- 开源 (1)
- 设计 (1)
- 监控 (3)
- english (1)
- 问题记录 (1)
- Bitmap (1)
- 云计算 (1)
- 问题排查 (1)
- highchat (1)
- mac (3)
- docker (1)
- jdk (1)
- 表达式 (1)
- 网络 (1)
- 时间管理 (1)
- 时间序列 (1)
- OLAP (1)
- Big Table (0)
- sql (1)
- kafka (1)
- md5 (1)
- springboot (1)
- spring security (1)
- Spring Boot (3)
- mybatis (1)
- java8 (1)
- 分布式事务 (1)
- 限流 (1)
- Shadowsocks (0)
- 2018 (1)
- 服务治理 (1)
- 设计原则 (1)
- log (0)
- perftools (1)
最新评论
-
siphlina:
课程——基于Python数据分析与机器学习案例实战教程分享网盘 ...
Python机器学习库 -
san_yun:
leibnitz 写道hi,我想知道,无论在92还是94版本, ...
hbase的行锁与多版本并发控制(MVCC) -
leibnitz:
hi,我想知道,无论在92还是94版本,更新时(如Puts)都 ...
hbase的行锁与多版本并发控制(MVCC) -
107x:
不错,谢谢!
Latent Semantic Analysis(LSA/ LSI)算法简介 -
107x:
不错,谢谢!
Python机器学习库
TcpNoDelay=false,为启用nagle算法,也是默认值。 Nagle算法的立意是良好的,避免网络中充塞小封包,提高网络的利用率。但是当Nagle算法遇到delayed ACK悲剧就发生了。Delayed ACK的本意也是为了提高TCP性能,跟应答数据捎带上ACK,同时避免糊涂窗口综合症,也可以一个ack确认多个段来节省开销。悲剧发生在这种情况,假设一端发送数据并等待另一端应答,协议上分为头部和数据,发送的时候不幸地选择了write-write,然后再read,也就是先发送头部,再发送数据,最后等待应答。
实验模型:
发送端(客户端)
write(head);
write(body);
read(response);
接收端(服务端)
read(request);
process(request);
write(response);
这里假设head和body都比较小,当默认启用nagle算法,并且是第一次发送的时候,根据nagle算法,第一个段head可以立即发送,因为没有等待确认的段;接收端(服务端)收到head,但是包不完整,继续等待body达到并延迟ACK;发送端(客户端)继续写入body,这时候nagle算法起作用了,因为head还没有被ACK,所以body要延迟发送。这就造成了发送端(客户端)和接收端(服务端)都在等待对方发送数据的现象:
发送端(客户端)等待接收端ACK head以便继续发送body;
接收端(服务端)在等待发送方发送body并延迟ACK,悲剧的无以言语。
这种时候只有等待一端超时并发送数据才能继续往下走。
代码:
发送端代码
[java] view plaincopyprint?
package socket.nagle;
import java.io.*;
import java.net.*;
import org.apache.log4j.Logger;
public class Client {
private static Logger logger = Logger.getLogger(Client.class);
public static void main(String[] args) throws Exception {
// 是否分开写head和body
boolean writeSplit = true;
String host = "localhost";
logger.debug("WriteSplit:" + writeSplit);
Socket socket = new Socket();
socket.setTcpNoDelay(false);
socket.connect(new InetSocketAddress(host, 10000));
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String head = "hello ";
String body = "world\r\n";
for (int i = 0; i < 10; i++) {
long label = System.currentTimeMillis();
if (writeSplit) {
out.write(head.getBytes());
out.write(body.getBytes());
} else {
out.write((head + body).getBytes());
}
String line = reader.readLine();
logger.debug("RTT:" + (System.currentTimeMillis() - label) + ", receive: " + line);
}
in.close();
out.close();
socket.close();
}
}
接收端代码
[java] view plaincopyprint?
package socket.nagle;
import java.io.*;
import java.net.*;
import org.apache.log4j.Logger;
public class Server {
private static Logger logger = Logger.getLogger(Server.class);
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress(10000));
logger.debug(serverSocket);
logger.debug("Server startup at 10000");
while (true) {
Socket socket = serverSocket.accept();
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
while (true) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = reader.readLine();
logger.debug(line);
out.write((line + "\r\n").getBytes());
} catch (Exception e) {
break;
}
}
}
}
}
实验结果:
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Server
1 [main] DEBUG socket.nagle.Server - ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=10000]
6 [main] DEBUG socket.nagle.Server - Server startup at 10000
4012 [main] DEBUG socket.nagle.Server - hello world
4062 [main] DEBUG socket.nagle.Server - hello world
4105 [main] DEBUG socket.nagle.Server - hello world
4146 [main] DEBUG socket.nagle.Server - hello world
4187 [main] DEBUG socket.nagle.Server - hello world
4228 [main] DEBUG socket.nagle.Server - hello world
4269 [main] DEBUG socket.nagle.Server - hello world
4310 [main] DEBUG socket.nagle.Server - hello world
4350 [main] DEBUG socket.nagle.Server - hello world
4390 [main] DEBUG socket.nagle.Server - hello world
4392 [main] DEBUG socket.nagle.Server -
4392 [main] DEBUG socket.nagle.Server -
实验1:当WriteSplit=true and TcpNoDelay=false 启用nagle算法
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Client
0 [main] DEBUG socket.nagle.Client - WriteSplit:true
52 [main] DEBUG socket.nagle.Client - RTT:12, receive: hello world
95 [main] DEBUG socket.nagle.Client - RTT:42, receive: hello world
137 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
178 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
218 [main] DEBUG socket.nagle.Client - RTT:40, receive: hello world
259 [main] DEBUG socket.nagle.Client - RTT:40, receive: hello world
300 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
341 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
382 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
422 [main] DEBUG socket.nagle.Client - RTT:40, receive: hello world
可以看到,每次请求到应答的时间间隔都在40ms,除了第一次。linux的delayed ack是40ms,而不是原来以为的200ms。第一次立即ACK,似乎跟linux的quickack mode有关,这里我不是特别清楚,
其实问题不是出在nagle算法身上的,问题是出在write-write-read这种应用编程上。禁用nagle算法可以暂时解决问题,但是禁用 nagle算法也带来很大坏处,网络中充塞着小封包,网络的利用率上不去,在极端情况下,大量小封包导致网络拥塞甚至崩溃。在这种情况下,其实你只要避免write-write-read形式的调用就可以避免延迟现象,如下面这种情况发送的数据不要再分割成两部分。
实验2:当WriteSplit=false and TcpNoDelay=false 启用nagle算法
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Client
0 [main] DEBUG socket.nagle.Client - WriteSplit:false
27 [main] DEBUG socket.nagle.Client - RTT:4, receive: hello world
31 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
34 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
38 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
42 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
44 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
47 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
50 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
53 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
54 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
实验3:当WriteSplit=true and TcpNoDelay=true 禁用nagle算法
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Client
0 [main] DEBUG socket.nagle.Client - WriteSplit:true
25 [main] DEBUG socket.nagle.Client - RTT:6, receive: hello world
28 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
31 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
33 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
35 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
41 [main] DEBUG socket.nagle.Client - RTT:6, receive: hello world
49 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
52 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
56 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
59 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
实验4:当WriteSplit=false and TcpNoDelay=true 禁用nagle算法
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Client
0 [main] DEBUG socket.nagle.Client - WriteSplit:false
21 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
23 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
27 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
30 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
32 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
35 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
38 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
41 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
43 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
46 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
实验2到4,都没有出现延时的情况。
注意:以上实验在windows上测试下面的代码,客户端和服务器必须分在两台机器上,似乎winsock对loopback连接的处理不一样。下面的我的做法是:服务端与客户端都在一台Linux机上。
实验模型:
发送端(客户端)
write(head);
write(body);
read(response);
接收端(服务端)
read(request);
process(request);
write(response);
这里假设head和body都比较小,当默认启用nagle算法,并且是第一次发送的时候,根据nagle算法,第一个段head可以立即发送,因为没有等待确认的段;接收端(服务端)收到head,但是包不完整,继续等待body达到并延迟ACK;发送端(客户端)继续写入body,这时候nagle算法起作用了,因为head还没有被ACK,所以body要延迟发送。这就造成了发送端(客户端)和接收端(服务端)都在等待对方发送数据的现象:
发送端(客户端)等待接收端ACK head以便继续发送body;
接收端(服务端)在等待发送方发送body并延迟ACK,悲剧的无以言语。
这种时候只有等待一端超时并发送数据才能继续往下走。
代码:
发送端代码
[java] view plaincopyprint?
package socket.nagle;
import java.io.*;
import java.net.*;
import org.apache.log4j.Logger;
public class Client {
private static Logger logger = Logger.getLogger(Client.class);
public static void main(String[] args) throws Exception {
// 是否分开写head和body
boolean writeSplit = true;
String host = "localhost";
logger.debug("WriteSplit:" + writeSplit);
Socket socket = new Socket();
socket.setTcpNoDelay(false);
socket.connect(new InetSocketAddress(host, 10000));
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String head = "hello ";
String body = "world\r\n";
for (int i = 0; i < 10; i++) {
long label = System.currentTimeMillis();
if (writeSplit) {
out.write(head.getBytes());
out.write(body.getBytes());
} else {
out.write((head + body).getBytes());
}
String line = reader.readLine();
logger.debug("RTT:" + (System.currentTimeMillis() - label) + ", receive: " + line);
}
in.close();
out.close();
socket.close();
}
}
接收端代码
[java] view plaincopyprint?
package socket.nagle;
import java.io.*;
import java.net.*;
import org.apache.log4j.Logger;
public class Server {
private static Logger logger = Logger.getLogger(Server.class);
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress(10000));
logger.debug(serverSocket);
logger.debug("Server startup at 10000");
while (true) {
Socket socket = serverSocket.accept();
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
while (true) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = reader.readLine();
logger.debug(line);
out.write((line + "\r\n").getBytes());
} catch (Exception e) {
break;
}
}
}
}
}
实验结果:
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Server
1 [main] DEBUG socket.nagle.Server - ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=10000]
6 [main] DEBUG socket.nagle.Server - Server startup at 10000
4012 [main] DEBUG socket.nagle.Server - hello world
4062 [main] DEBUG socket.nagle.Server - hello world
4105 [main] DEBUG socket.nagle.Server - hello world
4146 [main] DEBUG socket.nagle.Server - hello world
4187 [main] DEBUG socket.nagle.Server - hello world
4228 [main] DEBUG socket.nagle.Server - hello world
4269 [main] DEBUG socket.nagle.Server - hello world
4310 [main] DEBUG socket.nagle.Server - hello world
4350 [main] DEBUG socket.nagle.Server - hello world
4390 [main] DEBUG socket.nagle.Server - hello world
4392 [main] DEBUG socket.nagle.Server -
4392 [main] DEBUG socket.nagle.Server -
实验1:当WriteSplit=true and TcpNoDelay=false 启用nagle算法
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Client
0 [main] DEBUG socket.nagle.Client - WriteSplit:true
52 [main] DEBUG socket.nagle.Client - RTT:12, receive: hello world
95 [main] DEBUG socket.nagle.Client - RTT:42, receive: hello world
137 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
178 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
218 [main] DEBUG socket.nagle.Client - RTT:40, receive: hello world
259 [main] DEBUG socket.nagle.Client - RTT:40, receive: hello world
300 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
341 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
382 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
422 [main] DEBUG socket.nagle.Client - RTT:40, receive: hello world
可以看到,每次请求到应答的时间间隔都在40ms,除了第一次。linux的delayed ack是40ms,而不是原来以为的200ms。第一次立即ACK,似乎跟linux的quickack mode有关,这里我不是特别清楚,
其实问题不是出在nagle算法身上的,问题是出在write-write-read这种应用编程上。禁用nagle算法可以暂时解决问题,但是禁用 nagle算法也带来很大坏处,网络中充塞着小封包,网络的利用率上不去,在极端情况下,大量小封包导致网络拥塞甚至崩溃。在这种情况下,其实你只要避免write-write-read形式的调用就可以避免延迟现象,如下面这种情况发送的数据不要再分割成两部分。
实验2:当WriteSplit=false and TcpNoDelay=false 启用nagle算法
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Client
0 [main] DEBUG socket.nagle.Client - WriteSplit:false
27 [main] DEBUG socket.nagle.Client - RTT:4, receive: hello world
31 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
34 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
38 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
42 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
44 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
47 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
50 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
53 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
54 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
实验3:当WriteSplit=true and TcpNoDelay=true 禁用nagle算法
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Client
0 [main] DEBUG socket.nagle.Client - WriteSplit:true
25 [main] DEBUG socket.nagle.Client - RTT:6, receive: hello world
28 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
31 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
33 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
35 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
41 [main] DEBUG socket.nagle.Client - RTT:6, receive: hello world
49 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
52 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
56 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
59 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
实验4:当WriteSplit=false and TcpNoDelay=true 禁用nagle算法
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Client
0 [main] DEBUG socket.nagle.Client - WriteSplit:false
21 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
23 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
27 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
30 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
32 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
35 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
38 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
41 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
43 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
46 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
实验2到4,都没有出现延时的情况。
注意:以上实验在windows上测试下面的代码,客户端和服务器必须分在两台机器上,似乎winsock对loopback连接的处理不一样。下面的我的做法是:服务端与客户端都在一台Linux机上。
发表评论
-
TCP滑动窗口
2014-06-04 16:10 868目前建立在TCP协议上的网络协议特别多,有telnet,ss ... -
TCP 滑动窗口协议
2013-11-07 18:36 5595TCP滑动窗口机制 我们可以大概看一下上图的模型 ... -
关于JAVA取本机ip的一些总结
2013-09-13 14:29 8250通常绑定本机ip地址 一般如下 I ... -
网络编程中Nagle算法和Delayed ACK的测试
2013-07-28 22:44 964网络编程中Nagle算法和Delayed ACK的测试 -
NFS-RPC框架优化过程(从37k到168k)
2013-07-18 22:17 1535NFS-RPC框架从编写之初,到现在为止(应该还会有些提升, ... -
Java程序员也应该知道的一些网络知识
2013-07-18 22:11 933对于需要编写网络通 ... -
深入理解JDBC的超时(timeout)设置
2013-06-26 15:27 6601真实案例:应用服务器在遭到DDos攻击后无法响应 在遭到 ... -
socket InputStream available()lock的问题
2013-03-28 18:45 3253在socket InputStream读取数据的问题记录一 ... -
socket参数对性能的影响
2013-03-26 14:51 1179今天发现线上一台机器的cilent端很慢,通过打点记录相关 ... -
socket InputStream读取数据的问题记录
2013-03-13 17:42 2457在用java写socket client的发现一个问题,如 ... -
python高性能网络框架Twisted介绍
2012-11-12 21:48 0什麼是Twisted Twisted是一 ... -
Reactor模式,或者叫反应器模式
2012-11-12 20:58 0原文:http://daimojingde ... -
libevent源码分析
2012-11-12 20:52 999原文参考: http://blog.csdn.net/spar ... -
java socket 参数说明
2012-11-10 16:19 1746Socket 的 I/O 调用可 ... -
一个自定义协议的例子
2012-11-10 14:54 3039public class VoteMsg { pr ... -
Socket send函数和recv函数详解
2012-11-09 12:17 1105int send( SOCKET s, c ... -
python struct
2012-11-07 14:03 804在使用python向java发送数据的时候一般是需要记录数据长 ... -
Frame实现
2012-11-06 21:01 890这里讨论Frame的实现问题。 -
Java Socket codec
2012-11-06 20:08 1176要写好java的网络编程并 ... -
Java网络编程--Socket编程
2012-11-03 23:07 1044原文:http://blog.sina.com.c ...
相关推荐
- `Handlers`从队列中取出`Call`对象,解析参数为`Invocation`对象,利用Java反射API调用服务端的实例对象处理请求,获取返回结果,并将结果封装到`Call`的`response`属性中。 - 处理完成后,调用`Responder`的`...
统考计算机应用基础考试大纲(2013年修订版).doc
内容概要:本文基于机器学习方法,探讨了中国区域现代化水平及其对经济效益的影响。研究首先构建了现代化发展评价指标体系,涵盖了经济、科技、人文、社会和文化五个维度,并采用突变级数法和熵权法计算出组合期望值。接着,利用BP神经网络模型对区域现代化水平指数进行拟合,结果显示我国现代化水平存在显著的区域差异,呈现东部沿海地区较高、西部内陆地区较低的特征。最后,通过随机森林模型分析发现,经济现代化和科技创新现代化是影响GDP最重要的两个因素,文化现代化次之,而人文和社会现代化的影响相对较小。;
内容概要:本文详细介绍了本杰明磁链模型在电机控制领域的应用,特别是在闭环带载启动方面的优势。文章首先展示了磁链模型的核心参数初始化及其精确性要求,接着深入探讨了磁链观测器的设计与实现,包括其微分方程、积分器以及遗忘因子的作用。文中还讨论了代码生成过程中遇到的问题及解决方案,如MATLAB生成代码的效率优化和查表法的应用。此外,文章介绍了带载启动的具体策略,包括转速-电流双闭环嵌套控制和滑模控制器的应用,并分享了实际测试数据和效果。最后,文章提供了调试经验和实战案例,强调了模型的鲁棒性和实用性。 适合人群:从事电机控制系统设计与开发的工程师和技术人员,尤其是关注高性能带载启动解决方案的专业人士。 使用场景及目标:适用于需要提高电机启动可靠性和稳定性的应用场景,如工业自动化设备、物流AGV等。目标是通过引入本杰明磁链模型,实现高效稳定的带载启动,减少启动时的电流波动和机械振动。 其他说明:本文不仅提供了理论分析,还包括大量实际代码示例和调试技巧,帮助读者更好地理解和应用这一先进技术。
内容概要:本文详细介绍了三电平NPC(Neutral Point Clamped)有源电力滤波器(APF)采用无差拍控制方法的MATLAB仿真过程。首先阐述了三电平NPC拓扑的优势及其在高压大功率场景的应用背景,接着深入探讨了无差拍控制的核心数学模型,包括电流预测、调制环节以及中点电位平衡处理。文中还提供了具体的MATLAB代码片段,展示了如何实现电流误差的前馈补偿、三电平PWM生成、SVPWM矢量切换逻辑等关键技术。此外,文章强调了仿真过程中需要注意的关键参数设置,如采样时间、电感值、调制策略等,并分享了一些常见的调试技巧和潜在问题的解决方案。 适用人群:从事电力电子、电力系统自动化领域的研究人员和技术人员,尤其适用于对有源电力滤波器和无差拍控制感兴趣的工程师。 使用场景及目标:①理解和掌握三电平NPC APF的工作原理和无差拍控制策略;②利用MATLAB/Simulink进行相关仿真的设计与调试;③提高谐波补偿效果,降低THD(总谐波失真),提升系统的动态响应性能。 其他说明:文章不仅提供了详细的理论分析和代码实现,还分享了许多实践经验,帮助读者更好地应对实际应用中的挑战。同时,提醒读者注意仿真环境与实际情况之间的差异,确保最终设计方案的可行性和可靠性。
hbase的安装与简单操作
内容概要:本文详细介绍了使用COMSOL软件进行变压器三相短路工况下绕组振动及电磁力的仿真分析。首先,通过定义绕组几何参数和材料属性,构建了电磁场和固体力学的多物理场耦合模型。然后,利用参数化扫描和频域电磁分析方法,精确模拟了短路瞬间的电磁场分布、轴向力、径向力以及磁密分布情况。接下来,在固体力学模块中引入瑞利阻尼和初始应力设置,实现了对绕组振动特性的动态仿真。最后,通过对仿真结果的后处理,得到了振动位移、力分布和频谱分析等重要数据,揭示了短路工况下绕组的复杂力学行为及其优化方向。 适合人群:从事电力设备设计、电磁兼容性和结构动力学研究的专业技术人员,尤其是有一定COMSOL仿真经验的研究人员。 使用场景及目标:适用于变压器设计过程中评估短路工况对绕组的影响,帮助工程师理解并解决因短路引起的振动和应力问题,从而提高变压器的安全性和可靠性。 其他说明:文中提供了详细的建模步骤和技术细节,强调了正确选择坐标系、材料参数和阻尼设置的重要性,并分享了一些避免常见错误的经验。
内容概要:本文详细介绍了如何在CATIA DMU模块中进行麦弗逊式独立悬架与齿轮齿条转向器的非参数化运动仿真。首先,文章解释了底盘结构及其运动特性,接着逐步展示了如何设置悬架和转向系统的运动副,包括旋转副、滑动副以及齿轮齿条副的具体配置方法。文中还特别强调了仿真过程中需要注意的技术细节,如参数设置、摩擦系数的选择、运动自由度的限制等。此外,作者分享了一些实用技巧,比如通过正弦函数驱动转向输入、利用传感器监测运动状态、导出并修改仿真动画等。 适合人群:从事汽车工程设计、机械仿真的工程师和技术人员,尤其是熟悉CATIA软件的用户。 使用场景及目标:适用于需要进行车辆转向系统和悬架系统联合仿真的场合,帮助工程师更好地理解和优化车辆动态性能,提高设计效率。 其他说明:文章提供了大量具体的VBA代码片段,便于读者直接应用于自己的项目中。同时,文中提到的一些调试经验和常见问题解决方法也非常有价值。
蓝色企业CMS网站后台管理模板
HBase 是基于 Java 开发的,需要安装 Java 8 或更高版本。可以通过在命令行中输入java -version来检查 Java 版本,如果未安装则需先安装 Java。HBase 依赖于 Hadoop 的分布式文件系统(HDFS)来存储数据,需要先安装并配置好 Hadoop 集群。确保 Hadoop 的相关服务(如 HDFS、YARN 等)已经正常启动。
内容概要:本文深入探讨了PQ控制三相并网逆变器的技术细节,涵盖PWM调制策略、LCL滤波器设计及其对电流THD的影响。PWM调制策略通过SPWM和SHEPWM实现直流电压到交流电压的高效转换;PQ控制方法利用电网电压定向的矢量控制原理,精确调节有功和无功功率;LCL滤波器有效抑制高频谐波,确保电流THD达到2.6%。此外,文中还介绍了仿真模型的搭建和调试技巧,展示了各模块之间的协同工作。 适合人群:从事电力电子研究和技术开发的专业人士,尤其是关注并网逆变器设计和优化的研究人员和工程师。 使用场景及目标:适用于希望深入了解并网逆变器内部机制的研发人员,帮助他们在实际工程项目中提高逆变器性能,降低谐波失真,优化系统效率。 其他说明:文中提供的代码片段和仿真模型有助于读者更好地理解和实践相关技术,同时引用了多篇权威文献供进一步学习。
内容概要:本文探讨了多智能体系统在间歇控制下的离散编队控制,特别是在MATLAB仿真环境中实现的具体方法和技术细节。文章首先介绍了多智能体系统的基本概念和背景,随后详细解释了间歇控制的概念及其在离散系统中的应用。文中提供了具体的MATLAB代码示例,用于演示智能体间的通信拓扑、控制策略以及状态更新过程。此外,还讨论了仿真过程中遇到的问题,如控制间隔的选择、耦合强度的影响等,并给出了相应的解决方案。最后,文章通过分析第二分量的仿真图,展示了间歇控制的有效性和特点。 适合人群:对多智能体系统、控制理论、MATLAB仿真感兴趣的科研人员、研究生及工程技术人员。 使用场景及目标:适用于研究多智能体系统的一致性、编队控制、包含控制等问题,旨在通过MATLAB仿真平台,理解和掌握间歇控制在离散系统中的应用,提高对智能体系统动态行为的认识。 其他说明:文章不仅提供了详细的代码实现,还分享了许多实践经验,如避免使用连续求解器、选择合适的控制参数等,有助于读者更好地进行实验和研究。同时,文章鼓励读者尝试不同的控制策略和参数设置,以探索更多的可能性。
内容概要:本文详细介绍了利用MATLAB进行西班牙风电场风速与功率预测的完整流程。首先,通过CEEMDAN分解将原始风速信号分解为多个本征模态分量(IMF),并处理残差项。接着,使用花授粉算法(FPA)优化极限学习机(ELM)和BP神经网络的权重,提高预测精度。针对风速-功率曲线的非线性特点,引入分段校正层进行功率预测。文中提供了详细的代码示例和参数设置建议,强调了数据预处理、模型优化和结果分析的关键步骤。 适合人群:从事风电场数据分析、预测建模的研究人员和技术人员,以及对MATLAB编程有一定基础的学习者。 使用场景及目标:适用于需要对复杂地形条件下的风电场进行精确风速和功率预测的场景。主要目标是通过先进的信号分解和优化算法,提高预测模型的准确性,减少预测误差。 其他说明:文中提到的技术手段不仅限于西班牙风电场,对于其他地区类似应用场景也有很好的借鉴意义。建议使用者根据具体数据情况进行适当调整,如IMF数量的选择、FPA参数的设定等。
内容概要:本文详细介绍了使用Comsol软件对Ar细通道棒板流注放电进行仿真的方法和技术细节。主要内容涵盖了几何模型的建立、物理场的设置、求解器的配置以及电子密度和电子温度的仿真结果分析。文中强调了在仿真过程中需要注意的关键参数和技巧,如网格划分、初始条件的选择、边界条件的设置等。通过对仿真结果的深入探讨,揭示了电子密度和电子温度在流注放电过程中的时空变化规律及其背后的原因。 适合人群:从事等离子体物理学研究的专业人士、研究生及以上学历的研究人员。 使用场景及目标:适用于需要深入了解Ar细通道棒板流注放电特性的科研项目,旨在帮助研究人员掌握Comsol仿真工具的应用技巧,提高仿真精度和效率。 其他说明:文章不仅提供了详细的仿真步骤指导,还分享了许多实践经验,有助于解决仿真过程中常见的问题。此外,文章还提到了一些优化求解器性能的方法,如采用分段扫描、分离求解等策略,进一步提升了仿真的实用性。
Android平台高通相机camera CamX架构的awbwrapper node算法设计
内容概要:本文详细探讨了DC-DC斩波电路中BUCK(降压)和BOOST(升压)两种电路的设计与仿真。对于BUCK电路,重点讨论了将200V降至50V的具体实现方法,包括占空比计算、电感选型以及开关损耗等问题,并提供了Python代码进行动态仿真。对于BOOST电路,则介绍了将6V升至15V的操作原理,涉及占空比设置、PWM控制及其Arduino代码实现。此外,还强调了实际应用中的注意事项,如电感电流纹波、二极管选择、MOSFET驱动隔离等。 适合人群:从事电力电子、嵌入式系统开发的技术人员,尤其是对DC-DC转换器有一定了解的研究者或工程师。 使用场景及目标:适用于需要深入了解BUCK和BOOST电路工作原理及其具体应用场景的人群。目标是帮助读者掌握这两种电路的设计要点,能够独立完成相关电路的设计与调试。 其他说明:文中不仅提供了理论推导和公式计算,还有具体的代码实例用于辅助理解和验证。同时,分享了一些实用的小贴士,有助于解决实际项目中遇到的问题。
内容概要:本文详细介绍了如何利用遗传算法对风电场的混合储能系统进行容量优化配置。首先解释了混合储能系统的基本结构及其重要性,然后逐步展示了如何用MATLAB实现遗传算法的关键步骤,包括种群初始化、适应度函数设计、交叉变异操作以及参数调优。文中还提供了具体的代码片段和实例,如初始化函数、适应度函数、交叉变异操作等,并通过实际案例验证了算法的有效性。此外,文章强调了遗传算法在处理复杂非线性问题时的优势,并给出了若干实用建议和技术细节。 适合人群:从事风电储能系统研究与开发的技术人员、研究生及以上学历的相关专业学生。 使用场景及目标:适用于需要对风电场储能系统进行优化配置的研究和工程项目,旨在降低成本、提高系统稳定性和经济效益。 其他说明:文中提供的代码可以直接用于MATLAB环境运行,同时附有详细的注释帮助理解。针对不同应用场景,可以根据实际情况调整参数和约束条件。
内容概要:本文详细介绍了并联P2构型的智混合动力汽车在SIMULINK平台上的整车模型搭建及其仿真过程。文章首先解释了P2构型的特点,即电动机位于发动机和变速箱之间,能够实现纯电驱动以及发动机和电动机共同工作的灵活性。接着阐述了如何利用MATLAB/SIMULINK创建包含发动机、电动机、电池等多个模块在内的整车模型,并展示了部分用于初始化各组件参数的基础代码片段。随后讨论了基于规则的控制策略,包括不同行驶条件下动力源的选择逻辑,如车速较低且电池电量足够时采用纯电模式,反之则启用混合动力模式。此外,文中还涉及到了具体的仿真步骤,强调了对仿真结果的关注,特别是发动机转速、电动机功率、电池电量的变化趋势。最终,作者分享了一些优化技巧,例如调整扭矩分配算法、修正单位转换错误等,使得模型更加贴近实际情况。 适合人群:从事新能源汽车研发的技术人员,尤其是熟悉MATLAB/SIMULINK工具链的研究者。 使用场景及目标:适用于希望深入了解混合动力汽车内部运作机制的人群,旨在帮助他们掌握从理论到实践的具体流程,从而为实际项目提供参考。 其他说明:文中提供了大量实用的代码示例和技术细节,有助于读者快速入门并深入理解相关知识点。同时,通过对模型验证环节的描述,突出了工程实践中遇到的问题及解决方案。
内容概要:本文详细介绍了固高GTS系列控制卡(8轴或4轴)在视觉点胶涂覆与伺服运动控制中的应用。首先讲述了硬件组网方式,包括工业相机与工控机的连接以及控制卡与伺服驱动器的接线注意事项。接着深入探讨了控制卡的初始化配置、视觉坐标转换为机械坐标的方法、运动轨迹规划(如S曲线规划)、轴同步校验、点胶阀控制等关键技术点。文中还分享了许多实战经验和常见问题的解决方法,如配置文件中的脉冲当量一致性、视觉触发的时间窗口控制、坐标系的实时更新等。最后强调了视觉点胶系统的精确性和稳定性对于提高生产良率的重要性。 适合人群:从事工业自动化、视觉点胶涂覆相关领域的工程师和技术人员。 使用场景及目标:适用于需要进行高精度点胶涂覆作业的企业,旨在帮助技术人员掌握固高GTS控制卡的具体应用方法,优化点胶工艺流程,提高产品质量和生产效率。 其他说明:文章不仅提供了详细的代码示例,还结合实际案例讲解了如何避免常见的错误和陷阱,确保系统稳定运行并达到预期效果。
内容概要:本文详细介绍了数据包络分析(DEA)在Matlab中的实现,涵盖了四种常见的DEA模型:CCR、面向输入的BCC、面向输出的BCC以及Additive模型。每种模型的实现均基于线性规划,通过具体的代码片段展示了如何构建和解决相应的优化问题。文中不仅提供了详细的代码解析,还讨论了模型选择、数据标准化、异常值处理等实际应用中的注意事项。此外,作者分享了一些调试技巧和实践经验,帮助读者更好地理解和应用DEA模型。 适合人群:具备一定数学和编程基础的研究人员和技术人员,尤其是那些从事效率评估、数据分析和优化领域的专业人士。 使用场景及目标:适用于需要评估多个决策单元(如企业、部门、项目等)效率的场合。通过实现和应用这些模型,可以帮助识别低效单元并提供具体的改进方向。目标是提高资源配置的有效性和生产效率。 其他说明:文中强调了数据标准化的重要性,指出当输入输出量纲差异较大时,建议进行归一化处理。同时,提到了一些常见的陷阱和解决方案,如处理无解情况和效率值大于1的问题。