我的服务器为什么CPU中有一个线程总是在高位运行

我的服务器为什么CPU中有一个线程总是在高位运行,第1张

关于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);

}

}

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 我的服务器为什么CPU中有一个线程总是在高位运行

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情