歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

zeromq使用注意點滴

1.關於介紹zeromq的就不說了,可以自己去看官方guide很詳細

2.主要說下在使用過程中需要注意的地方

1)使用如果使用c++的接口的時候,在你自己的類中或者apache模塊中

需要將zmq::context_t 對象定義在zmq::socket_t對象的前面,這樣可以保證銷毀的順序

2)使用sub-pub時候,如果sub沒有調用setsockopt設置過濾項(設置NULL則接受所有),那麼將會接收不到任何的消息,默認會阻塞所有消息

3)如果是後台服務集群使用且zmq需要bind端口的,那麼最好在iptables中進行下過濾,不要讓外部鏈接

連接過來,否則會造成cpu空轉;關於cpu空轉將會在最後說

4)客戶端連接服務器時,每個客戶端中的zmq,每個連接使用一個socket,雖然可以一個socket可以調用connect多次,也就是連接多個server。但是,記住,最好是一個socket只調用一次connect

5)使用zmq的程序,運行一段時間後(可能幾天),如果你碰到異常退出,並且你使用nohup運行的log

nohup.out中顯示zeromq connection timeout,那麼你可以zeromq/src/tcp_socket.cpp文件中的203行看是write的時候出錯。

  1. int zmq::tcp_socket_t::write (const void *data, int size) 
  2.     ssize_t nbytes = send (s, data, size, 0); 
  3.  
  4.     //  Several errors are OK. When speculative write is being done we may not  
  5.     //  be able to write a single byte to the socket. Also, SIGSTOP issued  
  6.     //  by a debugging tool can result in EINTR error.  
  7.     if (nbytes == -1 && (errno == EAGAIN || errno == EWOULDBLOCK || 
  8.           errno == EINTR)) 
  9.         return 0; 
  10.  
  11.     //  Signalise peer failure.  
  12.     if (nbytes == -1 && (errno == ECONNRESET || errno == EPIPE)) 
  13.         return -1; 
  14.  
  15.     errno_assert (nbytes != -1); 
  16.     return (size_t) nbytes; 

這是由於 errno_assert (nbytes != -1);造成的,但是,真正的原因是nbytes==-1時,errno==ETIMEDOUT ,在前面一行中沒有去添加對這個timeout的判斷,另外,可以參考該文件中對win上的處理。因此,這裡如果你碰到了timeout錯誤,那麼請將errno == ETIMEOUT加入到errno==EPIPE後面,然後重新編譯

6)關於cpu空轉。首先你可以用top 程序名,去看你的程序的cpu使用率是否是100%,而且基本固定不變,那麼這時候,你就需要懷疑是否你的程序的問題,然後通過lsof -p 程序的進程號,去查看是否有文件描述符有can't identify protocol,還要注意下,是否有外網的ip連接到你的zmq的監聽的端口。

然後,你可以在zeromq/src/epoll.cpp中的loop,rm_fd,add_fd函數中打log,看看在監聽到EPOLLERR|EPOLLHUP

的文件描述符是不是lsof -p 查看到的can't identify protocol的文件描述符一致。其實,只要做到前面5點,那麼cpu

空轉基本是不會出現的。

ps:最後,希望碰到問題,大家能自己思考為什麼會出現這樣的問題,該如何解決,對自己的提升會有很大的幫助。

Copyright © Linux教程網 All Rights Reserved