歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> zeromq使用注意點滴

zeromq使用注意點滴

日期:2017/3/1 10:00:41   编辑:Linux編程

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. {
  3. ssize_t nbytes = send (s, data, size, 0);
  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. // Signalise peer failure.
  11. if (nbytes == -1 && (errno == ECONNRESET || errno == EPIPE))
  12. return -1;
  13. errno_assert (nbytes != -1);
  14. return (size_t) nbytes;
  15. }

這是由於 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