我的服务器为什么CPU中有一个线程总是在高位运行
关于CPU100%解决的小窍门
1、驱动没有经过认证,造成CPU资源占用100%。大量的测试版的驱动在网上泛滥,造成了难以发现的故障原因。
2、防、杀毒软件造成故障。由于一些防、杀毒软加入了对网页、插件、邮件的随机监控,无疑增大了系统负担,可以根据情况有选择的开启服务。
3、病毒、木马造成。大量的蠕虫病毒在系统内部迅速复制,造成CPU占用资源率据高不下。解决办法:使用最新的杀毒软件在DOS模式下进行杀毒。经常性更新升级杀毒软件和防火墙,加强防毒意识,掌握正确的防杀毒知识。
4、开始->运行->msconfig->启动,关闭不必要的启动项,重启。
5、查看“svchost”进程。
Svchostexe是Windows XP系统的一个核心进程。Svchostexe不单单只出现在Windows XP中,在使用NT内核的Windows系统中都会有Svchostexe的存在。一般在Windows 2000中Svchostexe进程的数目为2个,而在Windows XP中Svchostexe进程的数目就上升到了4个及4个以上。
如何才能辨别哪些是正常的Svchostexe进程,而哪些是病毒进程呢?
Svchostexe的键值是在“HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionSvchost”,每个键值表示一个独立的Svchostexe组。
微软还为我们提供了一种察看系统正在运行在Svchostexe列表中的服务的方法。以Windows XP为例:在“运行”中输入:cmd,然后在命令行模式中输入:tasklist /svc。系统列出服务列表。如果使用的是Windows 2000系统则把前面的“tasklist /svc”命令替换为:“tlist -s”即可。
如果你怀疑计算机有可能被病毒感染,Svchostexe的服务出现异常的话通过搜索Svchostexe文件就可以发现异常情况。一般只会找到一个在:“C:WindowsSystem32”目录下的Svchostexe程序。如果你在其他目录下发现Svchostexe程序的话,那很可能就是中毒了。
还有一种确认Svchostexe是否中毒的方法是在任务管理器中察看进程的执行路径。但是由于在Windows系统自带的任务管理器不能察看进程路径,所以要使用第三方的进程察看工具。
上面简单的介绍了Svchostexe进程的相关情况。总而言之,Svchostexe是一个系统的核心进程,并不是病毒进程。但由于Svchostexe进程的特殊性,所以病毒也会千方百计的入侵Svchostexe。通过察看Svchostexe进程的执行路径可以确认是否中毒。
6、查看网络连接。主要是网卡。
7、把网卡、显卡、声卡卸载,然后重新安装一下驱动。
8、重装系统、常用软件、当然也要装驱动,用几天看一下。若不会出现这种问题,再装上其他软件,但是最好是一个软件装完,先用几天。现会出现问题再接装!
MySQL里面为了提高客户端请求创建连接过程的性能,提供了一个连接池也就是
Thread_Cache池,将空闲的连接线程放在连接池中,而不是立即销毁这样的好处就是,当又有一个新的请求的时候,mysql不会立即去创建连接
线程,而是先去Thread_Cache中去查找空闲的连接线程,如果存在则直接使用,不存在才创建新的连接线程
有关Thread_Cache在MySQL有几个重要的参数,简单介绍如下:
thread_cache_size
Thread_Cache
中存放的最大连接线程数在短连接的应用中Thread_Cache的功效非常明显,因为在应用中数据库的连接和创建是非常频繁的,如果不使用
Thread_Cache那么消耗的资源是非常可观的!在长连接中虽然带来的改善没有短连接的那么明显,但是好处是显而易见的但并不是越大越好大了反而
浪费资源这个的确定一般认为和物理内存有一定关系,如下:
复制代码 代码如下:
1G —> 8
2G —> 16
3G —> 32
>3G —> 64
如果短连接多的话可以适当加大
thread_stack
每个连接被创建的时候,mysql分配给它的内存这个值一般认为默认就可以应用于大部分场景了,除非必要非则不要动它
thread_handing
运用Thread_Cache处理连接的方式,5119添加的新特性有两个值可选[no-threads|one-thread-per-
connection] 看字面意思大家也该猜出八九分了,呵呵,no-threads
服务器使用一个线程,one-thread-per-connection
服务器为每个客户端请求使用一个线程原手册中提到,no-threads是在Linux下调试用的
复制代码 代码如下:
mysql> show variables like 'thread%';
+——————-+—————————+
| Variable_name | Value |
+——————-+—————————+
| thread_cache_size | 32 |
| thread_handling | one-thread-per-connection |
| thread_stack | 196608 |
+——————-+—————————+
3 rows in set (001 sec)
mysql> show status like '%connections%';
+———————-+——–+
| Variable_name | Value |
+———————-+——–+
| Connections | 199156 |
| Max_used_connections | 31 |
+———————-+——–+
2 rows in set (000 sec)
mysql> show status like '%thread%';
+————————+——–+
| Variable_name | Value |
+————————+——–+
| Delayed_insert_threads | 0 |
| Slow_launch_threads | 0 |
| Threads_cached | 3 |
| Threads_connected | 6 |
| Threads_created | 8689 |
| Threads_running | 5 |
+————————+——–+
6 rows in set (000 sec)
通过以上3个命令,可以看到服务器的 thread_cache池中最多可以存放32个连接线程,为每个客户端球使用一个线程为每个连接的线程分配192k的内存空间
服 务器总共有199156次连接,最大并发连接数为31,当前在thread_cashe池中的连接数为3个,连接数为6个,处于活跃状态的有5个,共创建 了8689次连接显然这里以短连接为主可以算出thread_cache命中率,公式为:
复制代码 代码如下:
Thread_Cache_Hit=(Connections-Thread_created)/Connections100%
当前服务器的Thread_cache命中率约为956%这个结果我还是比较满意的但是可以看出 thread_cache_size有点多余改成16或8更合理一些
服务器监听端口 做个无限循环 接到一个连接就创建一个通道线程,并将通道线程存储到一个list集合中
import javaioBufferedReader;import javaioIOException;
import javaioInputStreamReader;
import javaioPrintWriter;
import javanetServerSocket;
import javanetSocket;
import javatextSimpleDateFormat;
import javautilArrayList;
import javautilDate;
import javautilList;
/
4用socket通讯写出多个客户端和一个服务器端的通讯,
要求客户发送数据后能够回显相同的数据(回显功能)(实用TCP方式)。
/
public class Test4Server {
// 主入口
public static void main(String[] args) throws IOException {
scoketServer();
}
// 开启的tcp8888监听端口
public static void scoketServer() throws IOException {
ServerSocket server = new ServerSocket(8888);
while (true) {
// 未连通前线程阻塞,连通后开启一个socket通道线程后继续监听8888端口
Socket socket = serveraccept();
Systemoutprintln(socketgetInetAddress()getHostAddress()
+ "连接进入");
new SocketThread(socket)start();
}
}
}
// 一个服务器端口中监听多个客服端通道线程
class SocketThread extends Thread {
// 所有通道写入流的集合
private static List<PrintWriter> list =new ArrayList<PrintWriter>();
private BufferedReader bufferedReader;
private PrintWriter printWriter;
public SocketThread(Socket socket) throws IOException {
thisbufferedReader = new BufferedReader(new InputStreamReader(socket
getInputStream()));
thisprintWriter = new PrintWriter(socketgetOutputStream());
listadd(printWriter);
}
@Override
public void run() {
String string = null;
while (true) {
try {
// 服务器在通道中读到的信息回显给客服端
string = bufferedReaderreadLine();
Systemoutprintln("客服端信息:" + string);
for(PrintWriter printWriter:list ){
printWriterwrite("服务器回显:" + string + "\r\n");
printWriterflush();
}
} catch (IOException e) {
}
}
}
}
客服端代码 可以用在局域网中用多台来连接测试
import javaioBufferedReader;import javaioIOException;
import javaioInputStreamReader;
import javaioPrintWriter;
import javanetSocket;
import javautilScanner;
public class Test4Client {
public static Object obj = new Object();
// 客服端的主入口
public static void main(String[] args) throws IOException {
socketClient();
}
// 与服务器连通地址本机(127001),局域网中其他机器是(服务器在局域网中的ip地址) 端口都是8888
public static void socketClient() throws IOException {
Socket socket = new Socket("127001", 8888);
if (socketisConnected()) {
// 如果连接成功了就开启写和读的进程
new writer(socket)start();
new read(socket)start();
} else {
Systemoutprintln("服务器未开启");
}
}
}
// 写入到通道的线程
class writer extends Thread {
@SuppressWarnings("unused")
private Socket socket;
private PrintWriter printWriter;
private Scanner scanner = new Scanner(Systemin);
private String str = null;
public writer(Socket socket) throws IOException {
thissocket = socket;
thisprintWriter = new PrintWriter(socketgetOutputStream());
}
@Override
public void run() {
scanneruseDelimiter("\r\n");
while (true) {
Systemoutprint("请输入信息:");
// 产生扫描器的线程阻塞
str = scannernext();
Systemoutprintln("我说:"+str);
printWriterwrite(str + "\r\n");
printWriterflush();
try {
Threadsleep(200);
} catch (InterruptedException e) {
eprintStackTrace();
}
}
}
}
// 从通道中读取的线程
class read extends Thread {
private Socket socket;
private BufferedReader bufferedReader;
private String str = null;
public read(Socket socket) throws IOException {
thissocket = socket;
thisbufferedReader = new BufferedReader(new InputStreamReader(socket
getInputStream()));
}
@Override
public void run() {
while (true) {
try {
str = bufferedReaderreadLine();
Systemoutprintln(str);
} catch (IOException e) {
}
try {
Threadsleep(200);
} catch (InterruptedException e) {
eprintStackTrace();
}
}
}
}
服务器端:
import javaawt;
import javaawtevent;
import javaxswing;
import javaio;
import javanet;
import javautilVector;
public class OneToMoreServer extends JFrame implements ActionListener{
JPanel contentPane;
JLabel jLabel2 = new JLabel();
JTextField jTextField2 = new JTextField("4700");
JButton jButton1 = new JButton();
JLabel jLabel3 = new JLabel();
JTextField jTextField3 = new JTextField();
JButton jButton2 = new JButton();
JScrollPane jScrollPane1 = new JScrollPane();
JTextArea jTextArea1 = new JTextArea();
ServerSocket server = null;
Socket socket = null;BufferedReader instr =null;PrintWriter os=null ;
Vector vector=new Vector();
boolean serverRun=true;
boolean clientRun=true;
//Construct the frame
public OneToMoreServer() {
jbInit();
}
class MyThread extends Thread{//该线程负责接收数据
Socket socketI=null;
BufferedReader br=null;
public MyThread(Socket socket)
{
socketI=socket;
}
public void run(){
try{
while(clientRun){
thissleep(100);
br= new BufferedReader(new InputStreamReader(socketIgetInputStream()));
if(brready()){ //检查是否有数据
jTextArea1append("接收到来自客户端("+socketIgetInetAddress()toString()+")的消息: "+brreadLine()+"\n");
}
}
}catch(Exception ex){JOptionPaneshowMessageDialog(null,extoString());}
}
}
public void actionPerformed(ActionEvent e){
if(egetSource()==jButton1){
int port=IntegerparseInt(jTextField2getText()trim());
//监听指定端口
try
{
server = new ServerSocket(port);
new Thread(new ListenClient())start();
}
catch(IOException ex)
{
JOptionPaneshowMessageDialog(null,extoString());
}
}
if(egetSource()==jButton2){
String msg=jTextField3getText()trim();
if(msglength()!=0)
sendData("hello");
}
}
//该线程负责监听指定端口
class ListenClient implements Runnable
{
public void run()
{
try{
if(jButton1getText()trim()equals("侦听")){
jButton1setText("正在侦听");
while(serverRun)
{
Socket socketI=serveraccept();//有客户端连入时建立一个线程监听客户端发送的消息
vectoradd(socketI);
jButton1setText("正在聊天");
jTextArea1append("客户端"+socketIgetInetAddress()toString()+"已经连接到服务器\n");
MyThread t=new MyThread(socketI);
tstart();
}
}
}catch(Exception ex){
JOptionPaneshowMessageDialog(null,extoString());
}
}
}
private void sendData(String s){//发送数据
try{
for(int i=0;i<vectorsize();i++)
{
//怎么广播
//向每个客户端发送一条消息
Socket socket=(Socket)vectorget(i);
os= new PrintWriter(socketgetOutputStream());
osprintln(s);
osflush();
}
}catch(Exception ex){
}
}
private void jbInit() {
contentPane = (JPanel) thisgetContentPane();
contentPanesetLayout(null);
thissetSize(new Dimension(540, 340));
thissetTitle("服务器");
jLabel2setBounds(new Rectangle(22, 27, 72, 28));
jLabel2setText("端口号");
jLabel2setFont(new javaawtFont("宋体", 0, 14));
jTextField2setBounds(new Rectangle(113, 27, 315, 24));
jButton1setBounds(new Rectangle(440, 28, 73, 25));
jButton1setFont(new javaawtFont("Dialog", 0, 14));
jButton1setBorder(BorderFactorycreateEtchedBorder());
jButton1setActionCommand("jButton1");
jButton1setText("侦听");
jLabel3setBounds(new Rectangle(23, 57, 87, 28));
jLabel3setText("请输入信息");
jLabel3setFont(new javaawtFont("宋体", 0, 14));
jTextField3setBounds(new Rectangle(114, 60, 314, 24));
jTextField3setText("");
jButton2setText("广播");
jButton2setActionCommand("jButton1");
jButton2setBorder(BorderFactorycreateEtchedBorder());
jButton2setFont(new javaawtFont("Dialog", 0, 14));
jButton2setBounds(new Rectangle(440, 58, 73, 25));
jScrollPane1setBounds(new Rectangle(23, 92, 493, 189));
contentPaneadd(jTextField2, null);
contentPaneadd(jButton1, null);
contentPaneadd(jLabel3, null);
contentPaneadd(jTextField3, null);
contentPaneadd(jButton2, null);
contentPaneadd(jScrollPane1, null);
contentPaneadd(jLabel2, null);
jScrollPane1getViewport()add(jTextArea1, null);
jButton1addActionListener(this);
jButton2addActionListener(this);
thisaddWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
try{
socketclose();
instrclose();
Systemexit(0);
}catch(Exception ex){
//JOptionPaneshowMessageDialog(null,extoString());
}
}
});
}
public static void main(String arg[]){
JFramesetDefaultLookAndFeelDecorated(true);
OneToMoreServer frm=new OneToMoreServer();
frmsetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
frmsetVisible(true);
}
}
客户端
import javaawt;
import javaawtevent;
import javaxswing;
import javaio;
import javanet;
public class Client extends JFrame implements ActionListener{
JPanel contentPane;
JLabel jLabel1 = new JLabel();
JTextField jTextField1 = new JTextField("127001");
JLabel jLabel2 = new JLabel();
JTextField jTextField2 = new JTextField("4700");
JButton jButton1 = new JButton();
JLabel jLabel3 = new JLabel();
JTextField jTextField3 = new JTextField();
JButton jButton2 = new JButton();
JScrollPane jScrollPane1 = new JScrollPane();
JTextArea jTextArea1 = new JTextArea();
BufferedReader instr =null;
Socket socket = null;
PrintWriter os=null;
public Client() {
jbInit();
}
class MyThread extends Thread{
public void run(){
try{
os=new PrintWriter(socketgetOutputStream());
instr=new BufferedReader(new InputStreamReader(socketgetInputStream()));
while(true)
{
thissleep(100);
if(instrready())
{
jTextArea1append("接收到来自服务器的消息: "+instrreadLine()+"\n");
}
}
}catch(Exception ex){
JOptionPaneshowMessageDialog(null,extoString());
}
}
}
public void actionPerformed(ActionEvent e){
if(egetSource()==jButton1){
String ip=jTextField3getText()trim();
int port=IntegerparseInt(jTextField2getText()trim());
connectServer(ip,port);
}
if(egetSource()==jButton2){
String s=thisjTextField3getText()trim();
sendData(s);
}
}
private void connectServer(String ip,int port){//连接
try{
if(jButton1getText()trim()equals("连接")){
jButton1setText("连接服务器");
socket=new Socket(ip,port);
jButton1setText("正在聊天");
MyThread t=new MyThread();
tstart();
}
}catch(Exception ex){
JOptionPaneshowMessageDialog(this,extoString());
}
}
private void sendData(String s){//发送数据
try{
os = new PrintWriter(socketgetOutputStream());
osprintln(s);
osflush();
thisjTextArea1append("向服务器发送消息:"+s+"\n");
}catch(Exception ex){
JOptionPaneshowMessageDialog(this,extoString());
}
}
private void jbInit() {
contentPane = (JPanel) thisgetContentPane();
jLabel1setFont(new javaawtFont("宋体", 0, 14));
jLabel1setText("服务器名称");
jLabel1setBounds(new Rectangle(20, 22, 87, 28));
contentPanesetLayout(null);
thissetSize(new Dimension(540, 340));
thissetTitle("客户端");
jTextField1setBounds(new Rectangle(114, 26, 108, 24));
jLabel2setBounds(new Rectangle(250, 25, 72, 28));
jLabel2setText("端口号");
jLabel2setFont(new javaawtFont("宋体", 0, 14));
jTextField2setBounds(new Rectangle(320, 27, 108, 24));
jButton1setBounds(new Rectangle(440, 28, 73, 25));
jButton1setFont(new javaawtFont("Dialog", 0, 14));
jButton1setBorder(BorderFactorycreateEtchedBorder());
jButton1setActionCommand("jButton1");
jButton1setText("连接");
jLabel3setBounds(new Rectangle(23, 57, 87, 28));
jLabel3setText("请输入信息");
jLabel3setFont(new javaawtFont("宋体", 0, 14));
jTextField3setBounds(new Rectangle(114, 60, 314, 24));
jButton2setText("发送");
jButton2setActionCommand("jButton1");
jButton2setBorder(BorderFactorycreateEtchedBorder());
jButton2setFont(new javaawtFont("Dialog", 0, 14));
jButton2setBounds(new Rectangle(440, 58, 73, 25));
jScrollPane1setBounds(new Rectangle(23, 92, 493, 189));
contentPaneadd(jLabel1, null);
contentPaneadd(jTextField1, null);
contentPaneadd(jLabel2, null);
contentPaneadd(jTextField2, null);
contentPaneadd(jButton1, null);
contentPaneadd(jLabel3, null);
contentPaneadd(jTextField3, null);
contentPaneadd(jButton2, null);
contentPaneadd(jScrollPane1, null);
jScrollPane1getViewport()add(jTextArea1, null);
jButton1addActionListener(this);
jButton2addActionListener(this);
thisaddWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
try{
socketclose();instrclose();osclose();Systemexit(0);
}catch(Exception ex){
JOptionPaneshowMessageDialog(null,extoString());
}
}
});
}
public static void main(String arg[]){
JFramesetDefaultLookAndFeelDecorated(true);
Client frm=new Client();
frmsetVisible(true);
}
}
0条评论